如果JDBC連線處於自動提交模式,預設情況下,則每個SQL語句在完成後都會提交到資料庫。
對於簡單的應用程式可能沒有問題,但是有三個原因需要考慮是否關閉自動提交並管理自己的事務 -
事務能夠控制何時更改提交並應用於資料庫。 它將單個SQL語句或一組SQL語句視為一個邏輯單元,如果任何語句失敗,整個事務將失敗。
要啟用手動事務支援,而不是使用JDBC驅動程式預設使用的自動提交模式,請呼叫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
語句不會成功執行,因為所有操作都被回滾了。
為了更好的理解,建議學習研究「事務提交範例程式碼」。
新的JDBC 3.0新新增了Savepoint
介面提供了額外的事務控制能力。大多數現代DBMS支援其環境中的儲存點,如Oracle的PL/SQL。
設定儲存點(Savepoint
)時,可以在事務中定義邏輯回滾點。 如果通過儲存點(Savepoint
)發生錯誤時,則可以使用回滾方法來撤消所有更改或僅儲存儲存點之後所做的更改。
Connection
物件有兩種新的方法可用來管理儲存點 -
Savepoint
物件。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
語句都不會成功,因為所有操作都被回滾了。
為了更好的理解,建議學習研究儲存點範例程式碼。