事務的提交和回滾:
在JDBC API中,默認的情況爲自動提交事務和回滾事務,也就是說,每一條對數據庫的更新的sql語句代表一項事務,操作成功後,系統自動調用commit()來提交,否則將調用rollback()來撤消事務。
可以通過調用setAutoCommit(false) 來禁止自動提交事務。然後把多條更新數據庫的sql語句做爲一個事務,在所有操作完成之後,調用commit()來進行整體提交。倘若其中一項 sql操作失敗,就不會執行commit()方法,而是產生相應的sqlexception,此時就可以捕獲異常代碼塊中調用rollback()方法撤消事務。
public int delete(int sID) {
dbc = new DataBaseConnection();
Connection con = dbc.getConnection();
try {
con.setAutoCommit(false);// 更改JDBC事務的默認提交方式
dbc.executeUpdate("delete from xiao where ID=" + sID);
dbc.executeUpdate("delete from xiao_content where ID=" + sID);
dbc.executeUpdate("delete from xiao_affix where bylawid=" + sID);
con.commit();//提交JDBC事務
con.setAutoCommit(true);// 恢復JDBC事務的默認提交方式
dbc.close();
return 1;
}
catch (Exception exc) {
con.rollBack();//回滾JDBC事務
exc.printStackTrace();
dbc.close();
return -1;
}
}
以上代碼我們手動處理JDBC事務,JDBC的數據庫連接對象Connection提供了三種事務控制方式:
(1) setAutoCommit(Boolean autoCommit):設置是否自動提交事務;
(2) commit();提交事務;
(3) rollback();撤消事務;
注:事務週期限於Connection的生命週期。JDBC 事務的一個缺點是事務的範圍侷限於一個數據庫連接。一個 JDBC 事務不能跨越多個數據庫。
JDBC事務隔離級別:
JDBC定義了五種事務隔離級別:
TRANSACTION_NONE 說明不支持事務。
TRANSACTION_READ_UNCOMMITTED 說明在提交前一個事務可以看到另一個事務的變化。這樣髒讀、不可重複的讀和虛讀都是允許的。
髒讀:在沒有提交數據時能夠讀到已經更新的數據
TRANSACTION_READ_COMMITTED 說明讀取未提交的數據是不允許的。這個級別仍然允許不可重複的讀和虛讀產生。
不可重複的讀:在一個事務中進行查詢時,允許讀取提交前的數據,數據提交後,當前查詢就可以讀取到數據。update數據時候並不鎖住表
TRANSACTION_REPEATABLE_READ 說明事務保證能夠再次讀取相同的數據而不會失敗,但虛讀仍然會出現。
虛讀:允許讀取到其他事務提交的新增數據
TRANSACTION_SERIALIZABLE 是最高的事務級別,它防止髒讀、不可重複的讀和虛讀,在一個事務中進行查詢時,不允許任何對這個查詢表的數據修改。
在JDBC中,通過如下API設置事務隔離級別
conn.setTransactionLevel(TRANSACTION_SERIALIZABLE) ;
int level = conn.getTransactionIsolation();
保存點(SavePoint):
JDBC定義了SavePoint接口,提供了一個更細粒度的事務控制機制。當設置了一個保存點後,可以rollback到該保存點處的狀態,而不是rollback整個事務。
Connection接口的setSavepoint和releaseSavepoint方法可以設置和釋放保存點。
Savepoint sp = conn.setSavepoint();
Conn.rollback(sp);
Conn.commit(); //回滾後必須要提交
JDBC規範雖然定義了事務的以上支持行爲,但是各個JDBC驅動,數據庫廠商對事務的支持程度可能各不相同。如果在程序中任意設置,可能得不到想要的效果