JDBC 事務(wù)

2018-09-28 19:59 更新

事務(wù)

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

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

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

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

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

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

conn.setAutoCommit(false);

提交和回滾

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

conn.commit( );

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

conn.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();
}

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

使用還原點

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

當(dāng)你在事務(wù)中設(shè)置一個還原點來定義一個邏輯回滾點。如果在一個還原點之后發(fā)生錯誤,那么可以使用 rollback 方法來撤消所有的修改或在該還原點之后所做的修改。

Connection 對象有兩個新的方法來管理還原點-

  • setSavepoint(String savepointName): 定義了一個新的還原點。它也返回一個 Savepoint 對象。

  • releaseSavepoint(Savepoint savepointName): 刪除一個還原點。請注意,它需要一個作為參數(shù)的 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 語句不會成功,一切都將被回滾到最初狀態(tài)。

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號