JDBC 事務(wù)

jdbc 事務(wù)

默認(rèn)情況下 jdbc 事務(wù)處于自動提交模式,每個 sql 語句都是在完成時自動提交到數(shù)據(jù)庫。

在有些場景下,我們可能想關(guān)閉自動提交和管理自己的事務(wù):

  • 為了提高性能;
  • 為了保持業(yè)務(wù)流程的完整性。
  • 使用分布式事務(wù)。

所謂事務(wù)就是把單個 sql 語句或一組 sql 語句作為一個邏輯單元,如果任何語句失敗,整個事務(wù)失敗。

jdbc驅(qū)動程序默認(rèn)使用 auto-commit 模式,如果要啟用手動事務(wù)支持,使用 connection 對象的的 setautocommit() 方法。如果傳遞一個布爾值 false 到 setautocommit(),關(guān)閉自動提交。可以傳遞一個布爾值 true 將其重新打開。

例如,如果有一個名為 conn 的 connection 對象,以下代碼來關(guān)閉自動提交:

conn.setautocommit(false);

 

1. 提交和回滾

一旦已經(jīng)完成了變化,要提交更改,然后調(diào)用 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. 使用保存點(diǎn)

jdbc 保存點(diǎn)的接口提供了額外的事務(wù)控制。設(shè)置一個保存點(diǎn)就是在事務(wù)中定義一個邏輯回滾點(diǎn)。如果發(fā)生錯誤,則可以使用 rollback 方法來撤消到上一個保存點(diǎn)。

connection 對象有兩個新的方法,可幫助管理保存點(diǎn):

  • setsavepoint(string savepointname): 定義了一個新的保存點(diǎn)。它也返回一個savepoint 對象。
  • releasesavepoint(savepoint savepointname): 刪除一個保存點(diǎn)。請注意,它需要一個savepoint 對象作為參數(shù)。這個對象通常是由setsavepoint()方法生成一個保存點(diǎn)。

有一個rollback ( string savepointname ) 方法回滾工作到指定的保存點(diǎn)。 

下面的例子演示如何使用 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 語句不成功,一切都將被回滾。

下一節(jié):jdbc 事務(wù)提交回滾范例

jdbc 教程

相關(guān)文章
亚洲国产精品第一区二区,久久免费视频77,99V久久综合狠狠综合久久,国产免费久久九九免费视频