事務管理之JDBC事務

事務的提交和回滾:

在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驅動,數據庫廠商對事務的支持程度可能各不相同。如果在程序中任意設置,可能得不到想要的效果




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章