位置:首頁 > Java技術 > JDBC教學 > JDBC事務

JDBC事務

如果JDBC連接是在自動提交模式下,它在默認情況下,那麼每個SQL語句都是在其完成時提交到數據庫。

這可能是對簡單的應用程序,但有三個原因,你可能想關閉自動提交和管理自己的事務:

  • 為了提高性能

  • 為了保持業務流程的完整性

  • 使用分布式事務

若要控製事務,以及何時更改應用到數據庫。它把單個SQL語句或一組SQL語句作為一個邏輯單元,而且如果任何語句失敗,整個事務失敗。

若要啟用,而不是JDBC驅動程序默認使用auto-commit模式手動事務支持,使用Connection對象的的setAutoCommit()方法。如果傳遞一個布爾值false到setAutoCommit(),關閉自動提交。可以傳遞一個布爾值true將其重新打開。

例如,如果有一個名為conn Connection對象,以下代碼來關閉自動提交:

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語句會成功,一切都將被回滾。

為了更好地理解,建議學習事務提交實例代碼.

使用保存點:

新的JDBC3.0保存點的接口提供了額外的事務控製。他們的環境中,如Oracle的PL/ SQL中的大多數現代的DBMS支持保存點。

當設置一個保存點在事務中定義一個邏輯回滾點。如果發生錯誤,過去一個保存點,則可以使用rollback方法來撤消要麼所有的改變或僅保存點之後所做的更改。

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語句會成功,一切都將被回滾。

為了更好地理解,建議學習保存點實例代碼.