jdbc 事務(wù)
默認(rèn)情況下 jdbc 事務(wù)處于自動(dòng)提交模式,每個(gè) sql 語(yǔ)句都是在完成時(shí)自動(dòng)提交到數(shù)據(jù)庫(kù)。
在有些場(chǎng)景下,我們可能想關(guān)閉自動(dòng)提交和管理自己的事務(wù):
- 為了提高性能;
- 為了保持業(yè)務(wù)流程的完整性。
- 使用分布式事務(wù)。
所謂事務(wù)就是把單個(gè) sql 語(yǔ)句或一組 sql 語(yǔ)句作為一個(gè)邏輯單元,如果任何語(yǔ)句失敗,整個(gè)事務(wù)失敗。
jdbc驅(qū)動(dòng)程序默認(rèn)使用 auto-commit 模式,如果要啟用手動(dòng)事務(wù)支持,使用 connection 對(duì)象的的 setautocommit() 方法。如果傳遞一個(gè)布爾值 false 到 setautocommit(),關(guān)閉自動(dòng)提交。可以傳遞一個(gè)布爾值 true 將其重新打開。
例如,如果有一個(gè)名為 conn 的 connection 對(duì)象,以下代碼來關(guān)閉自動(dòng)提交:
conn.setautocommit(false);
1. 提交和回滾
一旦已經(jīng)完成了變化,要提交更改,然后調(diào)用 commit(在連接對(duì)象)方法,如下所示:
conn.commit( );
否則回滾更新,使用下面的代碼:
onn.rollback( );
下面的例子演示了如何使用一個(gè)提交和回滾對(duì)象:
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. 使用保存點(diǎn)
jdbc 保存點(diǎn)的接口提供了額外的事務(wù)控制。設(shè)置一個(gè)保存點(diǎn)就是在事務(wù)中定義一個(gè)邏輯回滾點(diǎn)。如果發(fā)生錯(cuò)誤,則可以使用 rollback 方法來撤消到上一個(gè)保存點(diǎn)。
connection 對(duì)象有兩個(gè)新的方法,可幫助管理保存點(diǎn):
- setsavepoint(string savepointname): 定義了一個(gè)新的保存點(diǎn)。它也返回一個(gè)savepoint 對(duì)象。
- releasesavepoint(savepoint savepointname): 刪除一個(gè)保存點(diǎn)。請(qǐng)注意,它需要一個(gè)savepoint 對(duì)象作為參數(shù)。這個(gè)對(duì)象通常是由setsavepoint()方法生成一個(gè)保存點(diǎn)。
有一個(gè)rollback ( string savepointname ) 方法回滾工作到指定的保存點(diǎn)。
下面的例子演示如何使用 savepoint 對(duì)象:
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 語(yǔ)句不成功,一切都將被回滾。
- JDBC 教程
- JDBC 驅(qū)動(dòng)類型
- JDBC 連接數(shù)據(jù)庫(kù)范例
- JDBC 連接數(shù)據(jù)庫(kù)步驟
- JDBC Statement, PreparedStatement 和 CallableStatement
- JDBC ResultSet 結(jié)果集
- JDBC Resultset 結(jié)果集范例
- JDBC 事務(wù)保存點(diǎn)范例
- Scala 教程
- Scala 簡(jiǎn)介
- Scala 類和對(duì)象
- Scala 文件 I/O
- Spring 教程
- Spring 模塊
- Spring 依賴注入
- Spring 自動(dòng)裝配
- Spring MVC教程
- Spring MVC表單標(biāo)簽庫(kù)
- Spring security