JDBC 事務(wù)

2018-09-28 19:59 更新

事務(wù)

如果你的 JDBC 連接是處于自動(dòng)提交模式下,該模式為默認(rèn)模式,那么每句 SQL 語句都是在其完成時(shí)提交到數(shù)據(jù)庫(kù)。

對(duì)簡(jiǎn)單的應(yīng)用程序來說這種模式相當(dāng)好,但有三個(gè)原因你可能想關(guān)閉自動(dòng)提交模式,并管理你自己的事務(wù)-

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

你可以通過事務(wù)在任意時(shí)間來控制以及更改應(yīng)用到數(shù)據(jù)庫(kù)。它把單個(gè) SQL 語句或一組 SQL 語句作為一個(gè)邏輯單元,如果其中任一語句失敗,則整個(gè)事務(wù)失敗。

若要啟用手動(dòng)事務(wù)模式來代替 JDBC 驅(qū)動(dòng)程序默認(rèn)使用的自動(dòng)提交模式的話,使用 Connection 對(duì)象的的 setAutoCommit()方法。如果傳遞一個(gè)布爾值 false 到 setAutoCommit()方法,你就關(guān)閉自動(dòng)提交模式。你也可以傳遞一個(gè)布爾值 true 將其再次打開。

例如,如果有一個(gè)名為 conn 的 Connection 對(duì)象,以下的代碼將關(guān)閉自動(dòng)提交模式-

conn.setAutoCommit(false);

提交和回滾

當(dāng)你完成了你的修改,并且要提交你的修改,可以在 connection 對(duì)象里調(diào)用 commit()方法,如下所示-

conn.commit( );

另外,用名為 conn 的連接回滾數(shù)據(jù)到數(shù)據(jù)庫(kù),使用如下所示的代碼-

conn.rollback( );

下面的例子說明了如何使用提交和回滾對(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();
}

在這種情況下,之前的 INSERT 語句不會(huì)成功,一切都將被回滾到最初狀態(tài)。

使用還原點(diǎn)

新的 JDBC 3.0 還原點(diǎn)接口提供了額外的事務(wù)控制。大部分現(xiàn)代的數(shù)據(jù)庫(kù)管理系統(tǒng)的環(huán)境都支持設(shè)定還原點(diǎn),例如 Oracle 的 PL/SQL。

當(dāng)你在事務(wù)中設(shè)置一個(gè)還原點(diǎn)來定義一個(gè)邏輯回滾點(diǎn)。如果在一個(gè)還原點(diǎn)之后發(fā)生錯(cuò)誤,那么可以使用 rollback 方法來撤消所有的修改或在該還原點(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è)作為參數(shù)的 Savepoint 對(duì)象。這個(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 語句不會(huì)成功,一切都將被回滾到最初狀態(tài)。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)