如果你的 JDBC 連接是處于自動提交模式下,該模式為默認模式,那么每句 SQL 語句都是在其完成時提交到數(shù)據(jù)庫。
對簡單的應(yīng)用程序來說這種模式相當(dāng)好,但有三個原因你可能想關(guān)閉自動提交模式,并管理你自己的事務(wù)-
你可以通過事務(wù)在任意時間來控制以及更改應(yīng)用到數(shù)據(jù)庫。它把單個 SQL 語句或一組 SQL 語句作為一個邏輯單元,如果其中任一語句失敗,則整個事務(wù)失敗。
若要啟用手動事務(wù)模式來代替 JDBC 驅(qū)動程序默認使用的自動提交模式的話,使用 Connection 對象的的 setAutoCommit()方法。如果傳遞一個布爾值 false 到 setAutoCommit()方法,你就關(guān)閉自動提交模式。你也可以傳遞一個布爾值 true 將其再次打開。
例如,如果有一個名為 conn 的 Connection 對象,以下的代碼將關(guān)閉自動提交模式-
conn.setAutoCommit(false);
當(dāng)你完成了你的修改,并且要提交你的修改,可以在 connection 對象里調(diào)用 commit()方法,如下所示-
conn.commit( );
另外,用名為 conn 的連接回滾數(shù)據(jù)到數(shù)據(jù)庫,使用如下所示的代碼-
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 語句不會成功,一切都將被回滾到最初狀態(tài)。
新的 JDBC 3.0 還原點接口提供了額外的事務(wù)控制。大部分現(xiàn)代的數(shù)據(jù)庫管理系統(tǒng)的環(huán)境都支持設(shè)定還原點,例如 Oracle 的 PL/SQL。
當(dāng)你在事務(wù)中設(shè)置一個還原點來定義一個邏輯回滾點。如果在一個還原點之后發(fā)生錯誤,那么可以使用 rollback 方法來撤消所有的修改或在該還原點之后所做的修改。
Connection 對象有兩個新的方法來管理還原點-
setSavepoint(String savepointName): 定義了一個新的還原點。它也返回一個 Savepoint 對象。
有一個 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 語句不會成功,一切都將被回滾到最初狀態(tài)。
更多建議: