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語句會成功,一切都將被回滾。
為了更好地理解,建議學習保存點實例代碼.