在JDBC API中,默認的狀況爲自動提交事務和回滾事務,也就是說,每一條對數據庫的更新的sql語句表明一項事務,操做成功後,系統自動調用commit()來提交,不然將調用rollback()來撤消事務。java
能夠經過調用setAutoCommit(false) 來禁止自動提交事務。而後把多條更新數據庫的sql語句作爲一個事務,在全部操做完成以後,調用commit()來進行總體提交。假若其中一項 sql操做失敗,就不會執行commit()方法,而是產生相應的sqlexception,此時就能夠捕獲異常代碼塊中調用rollback()方法撤消事務。sql
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();撤消事務; 3d
注:事務週期限於Connection的生命週期。JDBC 事務的一個缺點是事務的範圍侷限於一個數據庫鏈接。一個 JDBC 事務不能跨越多個數據庫。 對象
JDBC定義了五種事務隔離級別: 接口
TRANSACTION_NONE 說明不支持事務。 生命週期
TRANSACTION_READ_UNCOMMITTED 說明在提交前一個事務能夠看到另外一個事務的變化。這樣髒讀、不可重複的讀和虛讀都是容許的。 事務
髒讀:在沒有提交數據時可以讀到已經更新的數據 ci
TRANSACTION_READ_COMMITTED 說明讀取未提交的數據是不容許的。這個級別仍然容許不可重複的讀和虛讀產生。 get
不可重複的讀:在一個事務中進行查詢時,容許讀取提交前的數據,數據提交後,當前查詢就能夠讀取到數據。update數據時候並不鎖住表
TRANSACTION_REPEATABLE_READ 說明事務保證可以再次讀取相同的數據而不會失敗,但虛讀仍然會出現。
虛讀:容許讀取到其餘事務提交的新增數據
TRANSACTION_SERIALIZABLE 是最高的事務級別,它防止髒讀、不可重複的讀和虛讀,在一個事務中進行查詢時,不容許任何對這個查詢表的數據修改。
在JDBC中,經過以下API設置事務隔離級別
conn.setTransactionLevel(TRANSACTION_SERIALIZABLE) ; int level = conn.getTransactionIsolation();
JDBC定義了SavePoint接口,提供了一個更細粒度的事務控制機制。當設置了一個保存點後,能夠rollback到該保存點處的狀態,而不是rollback整個事務。
Connection接口的setSavepoint和releaseSavepoint方法能夠設置和釋放保存點。
Savepoint sp = conn.setSavepoint(); Conn.rollback(sp); Conn.commit(); //回滾後必需要提交
JDBC規範雖然定義了事務的以上支持行爲,可是各個JDBC驅動,數據庫廠商對事務的支持程度可能各不相同。若是在程序中任意設置,可能得不到想要的效果。