JAVA事務系列二:JDBC事務

事務的提交和回滾:

在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事務隔離級別:

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();

保存點(SavePoint):

JDBC定義了SavePoint接口,提供了一個更細粒度的事務控制機制。當設置了一個保存點後,能夠rollback到該保存點處的狀態,而不是rollback整個事務。

Connection接口的setSavepoint和releaseSavepoint方法能夠設置和釋放保存點。

Savepoint sp = conn.setSavepoint();
Conn.rollback(sp);
Conn.commit();   //回滾後必需要提交

JDBC規範雖然定義了事務的以上支持行爲,可是各個JDBC驅動,數據庫廠商對事務的支持程度可能各不相同。若是在程序中任意設置,可能得不到想要的效果。

相關文章
相關標籤/搜索