如果 JDBC 連接處于自動提交模式(默認(rèn)情況下為自動提交模式) ,那么每條 SQL 語句在完成時都會提交給數(shù)據(jù)庫。這對于簡單的應(yīng)用程序可能很好,但是出于以下三個原因,您可能想要關(guān)閉自動提交并管理自己的事務(wù)-
為了提高性能。
保持業(yè)務(wù)流程的完整性。
使用分布式事務(wù)。
事務(wù)使您可以控制是否以及何時將更改應(yīng)用到數(shù)據(jù)庫。它將單個SQL語句或一組SQL語句視為一個邏輯單元,如果任何語句失敗,則整個事務(wù)都會失敗。
要啟用手動事務(wù)支持而不是JDBC驅(qū)動程序默認(rèn)使用的自動提交模式,請使用Connection對象的setAutoCommit()方法。如果將布爾值false傳遞給setAutoCommit( ),則會關(guān)閉自動提交功能。您可以傳遞布爾值true以再次將其重新打開。
例如,如果您有一個名為conn的Connection對象,請編寫以下代碼以關(guān)閉自動提交-
conn.setAutoCommit(false);
完成更改并要提交更改后,請在連接對象上調(diào)用方法commit(),如下所示:
conn.commit( );
否則,要回滾對使用名為 conn 的 Connection 進(jìn)行的數(shù)據(jù)庫更新,請使用以下代碼-
conn.rollback( );
以下示例說明了提交和回滾對象的用法-
try{ //假設(shè)一個有效的連接對象conn conn.setAutoCommit(false); Statement stmt = conn.createStatement(); String SQL = "INSERT INTO Employees " + "VALUES (106, 20, 'Rita', 'Tez')"; stmt.executeUpdate(SQL); //提交格式錯誤的SQL語句,該語句會中斷 String SQL = "INSERTED IN Employees " + "VALUES (107, 22, 'Sita', 'Singh')"; stmt.executeUpdate(SQL); // 如果沒有錯誤。 conn.commit(); }catch(SQLException se){ // 如果有任何錯誤。 conn.rollback(); }
在這種情況下,上面的INSERT語句都不會成功,并且所有內(nèi)容都會回滾。
為了更好地理解,讓我們研究“commit示例代碼”。
新的JDBC 3.0 Savepoint接口為您提供了其他事務(wù)控制。大多數(shù)現(xiàn)代DBMS在其環(huán)境中都支持保存點,例如Oracle的PL / SQL。
設(shè)置保存點時,您可以在事務(wù)中定義邏輯回滾點。如果在保存點之后發(fā)生錯誤,則可以使用回滾方法撤消所有更改,或僅撤消在保存點之后進(jìn)行的更改。
Connection對象具有兩個新方法,可幫助您管理保存點-
setSavepoint(String savepointName):定義一個新的保存點。它還返回一個Savepoint對象。
releaseSavepoint(Savepoint savepointName):刪除保存點。請注意,它需要一個Savepoint對象作為參數(shù)。該對象通常是由setSavepoint()方法生成的保存點。
rollback (String savepointName)方法可以將工作回滾到指定的保存點。
以下示例說明了Savepoint對象的用法-
try{ //假設(shè)一個有效的連接對象conn conn.setAutoCommit(false); Statement stmt = conn.createStatement(); //設(shè)置一個保存點 Savepoint savepoint1 = conn.setSavepoint("Savepoint1"); String SQL = "INSERT INTO Employees " + "VALUES (106, 20, 'Rita', 'Tez')"; stmt.executeUpdate(SQL); //提交格式錯誤的SQL語句,該語句會中斷 String SQL = "INSERTED IN Employees " + "VALUES (107, 22, 'Sita', 'Tez')"; stmt.executeUpdate(SQL); // 如果沒有錯誤,請?zhí)峤桓摹? conn.commit(); }catch(SQLException se){ // 如果有任何錯誤。 conn.rollback(savepoint1); }
在這種情況下,上面的INSERT語句都不會成功,并且所有內(nèi)容都會回滾。
為了更好地理解,讓我們研究Savepoints-示例代碼。