JDBC - 事務



如果您的 JDBC 連線處於自動提交模式(預設情況下),則每個 SQL 語句在完成時都會提交到資料庫。

對於簡單的應用程式,這可能很好,但是您可能希望關閉自動提交併管理自己的事務,原因有三個:

  • 提高效能。

  • 維護業務流程的完整性。

  • 使用分散式事務。

事務使您能夠控制是否以及何時將更改應用於資料庫。它將單個 SQL 語句或一組 SQL 語句視為一個邏輯單元,如果任何語句失敗,則整個事務失敗。

要啟用手動事務支援而不是 JDBC 驅動程式預設使用的自動提交模式,請使用 Connection 物件的setAutoCommit()方法。如果將布林值 false 傳遞給 setAutoCommit(),則關閉自動提交。您可以傳遞布林值 true 以將其重新開啟。

例如,如果您有一個名為 conn 的 Connection 物件,請編寫以下程式碼以關閉自動提交:

conn.setAutoCommit(false);

提交和回滾

完成後要提交更改,請在連線物件上呼叫commit()方法,如下所示:

conn.commit( );

否則,要回滾使用名為 conn 的 Connection 進行的資料庫更新,請使用以下程式碼:

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 儲存點介面為您提供了額外的交易控制。大多數現代 DBMS 都支援其環境中的儲存點,例如 Oracle 的 PL/SQL。

設定儲存點時,您定義了事務中的一個邏輯回滾點。如果儲存點之後發生錯誤,您可以使用回滾方法撤消所有更改或僅撤消儲存點之後進行的更改。

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, 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 語句都不會成功,並且所有內容都將回滾。

為了更好地理解,讓我們學習儲存點 - 示例程式碼

廣告