JDBC事務

如果JDBC連接處於自動提交模式,默認情況下,則每個SQL語句在完成後都會提交到數據庫。

對於簡單的應用程序可能沒有問題,但是有三個原因需要考慮是否關閉自動提交併管理自己的事務 -

  • 提高性能
  • 保持業務流程的完整性
  • 使用分佈式事務

事務能夠控制何時更改提交併應用於數據庫。 它將單個SQL語句或一組SQL語句視爲一個邏輯單元,如果任何語句失敗,整個事務將失敗。

要啓用手動事務支持,而不是使用JDBC驅動程序默認使用的自動提交模式,請調用Connection對象的setAutoCommit()方法。 如果將布爾的false傳遞給setAutoCommit(),則關閉自動提交。 也可以傳遞一個布爾值true來重新打開它。

例如,如果有一個名爲connConnection對象,請將以下代碼關閉自動提交 -

conn.setAutoCommit(false);

提交和回滾

完成更改後,若要提交更改,那麼可在連接對象上調用commit()方法,如下所示:

conn.commit( );

否則,要使用連接名爲conn的數據庫回滾更新,請使用以下代碼 -

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語句不會成功執行,因爲所有操作都被回滾了。

爲了更好的理解,建議學習研究「事務提交示例代碼」。

使用保存點

新的JDBC 3.0新添加了Savepoint接口提供了額外的事務控制能力。大多數現代DBMS支持其環境中的保存點,如Oracle的PL/SQL。

設置保存點(Savepoint)時,可以在事務中定義邏輯回滾點。 如果通過保存點(Savepoint)發生錯誤時,則可以使用回滾方法來撤消所有更改或僅保存保存點之後所做的更改。

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, 24, 'Curry', 'Stephen')";
   stmt.executeUpdate(SQL);  
   //Submit a malformed SQL statement that breaks
   String SQL = "INSERTED IN Employees " +
                "VALUES (107, 32, 'Kobe', 'Bryant')";
   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語句都不會成功,因爲所有操作都被回滾了。

爲了更好的理解,建議學習研究保存點示例代碼。