Java-事務管理
阿新 • • 發佈:2017-06-13
pri getc 自己 forname rollback ger [] string 將不
rollback;
-- 回滾事務,將這個事務對數據庫的影響取消掉
conn.commit();
--提交事務
conn.rollback();
--回滾事務
也可以設置回滾點回滾部分事務。
Savepoint sp = conn.setSavepoint();
conn.rollback(sp);
--註意,回到回滾點後,回滾點之前的代碼雖然沒被回滾但是也沒提交呢,如果想起作用還要做commit操作.
1、事務的概念:
事務指邏輯上的一組操作,組成這組操作的各個單元,要麽全部成功,要麽全部不成功。
2、 管理事務:
2.1. 數據庫默認的事務
數據庫默認支持事務的,但是數據庫默認的事務是一條sql語句獨占一個事務,這種模式,意義不大。
2.2. 手動控制事務
如果希望自己控制事務也是可以的:
start transaction;
-- 開啟事務,在這條語句之後的所有的sql將處在同一事務中,要麽同時完成要麽同時不完成
......
--事務中的sql在執行時,並沒有真正修改數據庫中的數據
commit;
-- 提交事務,將整個事務對數據庫的影響一起發生
rollback;
-- 回滾事務,將這個事務對數據庫的影響取消掉
2.3. JDBC中控制事務
Connection conn
PreparedStatement pstat
ResultSet rs
當Jdbc程序向數據庫獲得一個Connection對象時,默認情況下這個Connection對象會自動向數據庫提交在它上面發送的SQL語句。若想關閉這種默認提交方式,讓多條SQL在一個事務中執行,可使用下列語句:
conn.setAutoCommit(false);
--關閉自動提交後,conn將不會幫我們提交事務,在這個連接上執行的所有sql語句將處在同一事務中,需要我們是手動的進行提交或回滾
conn.commit();
--提交事務
conn.rollback();
--回滾事務
也可以設置回滾點回滾部分事務。
Savepoint sp = conn.setSavepoint();
conn.rollback(sp);
--註意,回到回滾點後,回滾點之前的代碼雖然沒被回滾但是也沒提交呢,如果想起作用還要做commit操作.
public class TranDemo { public static void main(String[] args) { Connection conn= null; PreparedStatement pstat = null; Savepoint sp =null; try{ //String url = "jdbc:mysql://ip:3306/database"; String url = "jdbc:mysql:///day20"; Class.forName("com.mysql.jdbc.Driver"); conn= DriverManager.getConnection(url, "root", "root"); //開啟事務 conn.setAutoCommit(false); //a-520 pstat = conn.prepareStatement("update account set " + "money=money-? where name=?"); pstat.setDouble(1, 520); pstat.setString(2, "a"); pstat.executeUpdate(); //b+520 pstat = conn.prepareStatement("update account set " + "money=money+? where name=?"); pstat.setDouble(1, 520); pstat.setString(2, "b"); pstat.executeUpdate(); //設置回滾點 sp= conn.setSavepoint(); //b消費了1040 pstat = conn.prepareStatement("update account set " + "money=money-? where name=?"); pstat.setDouble(1, 1040); pstat.setString(2, "b"); pstat.executeUpdate(); //人為拋出一個異常 int x = 3/0; //a+1040 pstat = conn.prepareStatement("update account set " + "money=money+? where name=?"); pstat.setDouble(1, 1040); pstat.setString(2, "a"); pstat.executeUpdate(); //提交事務 conn.commit(); }catch (Exception e) { if(conn!=null){ if(sp!=null){ try { //回滾到到sp conn.rollback(sp); //將轉賬的操作提交 conn.commit(); } catch (SQLException e1) { e1.printStackTrace(); } }else{ try { //回滾事務開啟的地方 conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } } }finally{ //關閉數據庫連接。。。。 } } }
Java-事務管理