JDBC 事務
jdbc 事務
默認情況下 jdbc 事務處于自動提交模式,每個 sql 語句都是在完成時自動提交到數據庫。
在有些場景下,我們可能想關閉自動提交和管理自己的事務:
- 為了提高性能;
- 為了保持業務流程的完整性。
- 使用分布式事務。
所謂事務就是把單個 sql 語句或一組 sql 語句作為一個邏輯單元,如果任何語句失敗,整個事務失敗。
jdbc驅動程序默認使用 auto-commit 模式,如果要啟用手動事務支持,使用 connection 對象的的 setautocommit() 方法。如果傳遞一個布爾值 false 到 setautocommit(),關閉自動提交。可以傳遞一個布爾值 true 將其重新打開。
例如,如果有一個名為 conn 的 connection 對象,以下代碼來關閉自動提交:
conn.setautocommit(false);
1. 提交和回滾
一旦已經完成了變化,要提交更改,然后調用 commit(在連接對象)方法,如下所示:
conn.commit( );
否則回滾更新,使用下面的代碼:
onn.rollback( );
下面的例子演示了如何使用一個提交和回滾對象:
try{ //assume a valid connection object conn conn.setautocommit(false); statement stmt = conn.createstatement(); string sql = "insert into employees " + "values (106, 20, 'rita', 'tez')"; stmt.executeupdate(sql); //submit a malformed sql statement that breaks string sql = "inserted in employees " + "values (107, 22, 'sita', 'singh')"; stmt.executeupdate(sql); // if there is no error. conn.commit(); }catch(sqlexception se){ // if there is any error. conn.rollback(); }
2. 使用保存點
jdbc 保存點的接口提供了額外的事務控制。設置一個保存點就是在事務中定義一個邏輯回滾點。如果發生錯誤,則可以使用 rollback 方法來撤消到上一個保存點。
connection 對象有兩個新的方法,可幫助管理保存點:
- setsavepoint(string savepointname): 定義了一個新的保存點。它也返回一個savepoint 對象。
- releasesavepoint(savepoint savepointname): 刪除一個保存點。請注意,它需要一個savepoint 對象作為參數。這個對象通常是由setsavepoint()方法生成一個保存點。
有一個rollback ( string savepointname ) 方法回滾工作到指定的保存點。
下面的例子演示如何使用 savepoint 對象:
try{ //assume a valid connection object conn conn.setautocommit(false); statement stmt = conn.createstatement(); //set a savepoint savepoint savepoint1 = conn.setsavepoint("savepoint1"); string sql = "insert into employees " + "values (106, 20, 'rita', 'tez')"; stmt.executeupdate(sql); //submit a malformed sql statement that breaks string sql = "inserted in employees " + "values (107, 22, 'sita', 'tez')"; stmt.executeupdate(sql); // if there is no error, commit the changes. conn.commit(); }catch(sqlexception se){ // if there is any error. conn.rollback(savepoint1); }
在這種情況下如果 insert 語句不成功,一切都將被回滾。