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