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

為了更好的理解,建議學習研究儲存點範例程式碼