Java的JDBC事務

事務的特性(ACID):html

1) 原子性(atomicity):事務是數據庫的邏輯工做單位,並且是必須是原子工做單位,對於其數據修改,要麼所有執行,要麼所有不執行。sql

2) 一致性(consistency):事務在完成時,必須是全部的數據都保持一致狀態。在相關數據庫中,全部規則都必須應用於事務的修改,以保持全部數據的完整性。數據庫

3) 隔離性(isolation):一個事務的執行不能被其餘事務所影響。服務器

4) 持久性(durability):一個事務一旦提交,事物的操做便永久性的保存在DB中。即便此時再執行回滾操做也不能撤消所作的更改。多線程

事務(Transaction):是併發控制的單元,是用戶定義的一個操做序列。這些操做要麼都作,要麼都不作,是一個不可分割的工做單位。經過事務,sql server 能將邏輯相關的一組操做綁定在一塊兒,以便服務器 保持數據的完整性。事務一般是以begin transaction開始,以commit或rollback結束。Commint表示提交,即提交事務的全部操做。具體地說就是將事務中全部對數據的更新寫回到磁盤上的物理數據庫中去,事務正常結束。Rollback表示回滾,即在事務運行的過程當中發生了某種故障,事務不能繼續進行,系統將事務中對數據庫的全部已完成的操做所有撤消,滾回到事務開始的狀態。併發

自動提交事務:每條單獨的語句都是一個事務。每一個語句後都隱含一個commit。 (默認)高併發

顯式事務:以begin transaction顯示開始,以commit或rollback結束。fetch

隱式事務:當鏈接以隱式事務模式進行操做時,sql server數據庫引擎實例將在提交或回滾當前事務後自動啓動新事務。無須描述事物的開始,只需提交或回滾每一個事務。但每一個事務仍以commit或rollback顯式結束。鏈接將隱性事務模式設置爲打開以後,當數據庫引擎實例首次執行下列任何語句時,都會自動啓動一個隱式事務:alter table,insert,create,open ,delete,revoke ,drop,select, fetch ,truncate table,grant,update在發出commit或rollback語句以前,該事務將一直保持有效。在第一個事務被提交或回滾以後,下次當鏈接執行以上任何語句時,數據庫引擎實例都將自動啓動一個新事務。該實例將不斷地生成隱性事務鏈,直到隱性事務模式關閉爲止。 atom

Java JDBC事務機制spa

  首先,咱們來看看現有JDBC操做會給咱們打來什麼重大問題,好比有一個業務:當咱們修改一個信息後再去查詢這個信息,看是這是一個簡單的業務,實現起來也很是容易,但當這個業務放在多線程高併發的平臺下,問題天然就出現了,好比當咱們執行了一個修改後,在執行查詢以前有一個線程也執行了修改語句,這是咱們再執行查詢,看到的信息就有可能與咱們修改的不一樣,爲了解決這一問題,咱們必須引入JDBC事務機制,其實代碼實現上很簡單,一下給出一個原理實現例子供你們參考:

 1 private Connection conn = null;
 2 private PreparedStatement ps = null;
 3 try {
 4     conn.setAutoCommit(false);  //將自動提交設置爲false
 5     ps.executeUpdate("修改SQL"); //執行修改操做
 6     ps.executeQuery("查詢SQL");  //執行查詢操做
 7     conn.commit();                //當兩個操做成功後手動提交
 8 } catch (Exception e) {  
 9     conn.rollback();    //一旦其中一個操做出錯都將回滾,使兩個操做都不成功  
10     e.printStackTrace();
11 }

與事務相關的理論
1.事務(Transaction)的四個屬性(ACID)
原子性(Atomic) 對數據的修改要麼所有執行,要麼所有不執行。
一致性(Consistent) 在事務執行先後,數據狀態保持一致性。
隔離性(Isolated) 一個事務的處理不能影響另外一個事務的處理。
持續性(Durable) 事務處理結束,其效果在數據庫中持久化。

2.事務併發處理可能引發的問題
髒讀(dirty read): (讀未提交) 一個事務讀取了另外一個事務還沒有提交的數據,
不可重複讀(non-repeatable read): (讀已提交)一個事務的操做致使另外一個事務先後兩次讀取到不一樣的數據
幻讀(phantom read): (重複讀) 一個事務的操做致使另外一個事務先後兩次查詢的結果數據量不一樣。
舉例:
事務A、B併發執行時,
當A事務update後,B事務select讀取到A還沒有提交的數據,此時A事務rollback,則B讀到的數據是無效的"髒"數據。
當B事務select讀取數據後,A事務update操做更改B事務select到的數據,此時B事務再次讀去該數據,發現先後兩次的數據不同。
當B事務select讀取數據後,A事務insert或delete了一條知足A事務的select條件的記錄,此時B事務再次select,發現查詢到前次不存在的記錄("幻影"),或者前次的某個記錄不見了。

JDBC的事務支持
JDBC對事務的支持體如今三個方面:
1.自動提交模式(Auto-commit mode)
Connection提供了一個auto-commit的屬性來指定事務什麼時候結束。
a.當auto-commit爲true時,當每一個獨立SQL操做的執行完畢,事務當即自動提交,也就是說每一個SQL操做都是一個事務。
一個獨立SQL操做何時算執行完畢,JDBC規範是這樣規定的:
對數據操做語言(DML,如insert,update,delete)和數據定義語言(如create,drop),語句一執行完就視爲執行完畢。
對select語句,當與它關聯的ResultSet對象關閉時,視爲執行完畢。
對存儲過程或其餘返回多個結果的語句,當與它關聯的全部ResultSet對象所有關閉,全部update count(update,delete等語句操做影響的行數)和output parameter(存儲過程的輸出參數)都已經獲取以後,視爲執行完畢。
b. 當auto-commit爲false時,每一個事務都必須顯式調用commit方法進行提交,或者顯式調用rollback方法進行回滾。auto-commit默認爲true。
JDBC提供了5種不一樣的事務隔離級別,在Connection中進行了定義。

2.事務隔離級別(Transaction Isolation Levels)
JDBC定義了五種事務隔離級別:
TRANSACTION_NONE JDBC: 驅動不支持事務
TRANSACTION_READ_UNCOMMITTED: (讀未提交) 容許髒讀、不可重複讀和幻讀。
TRANSACTION_READ_COMMITTED: (讀已提交) 禁止髒讀,但容許不可重複讀和幻讀。
TRANSACTION_REPEATABLE_READ: (重複讀) 禁止髒讀和不可重複讀,單運行幻讀。
TRANSACTION_SERIALIZABLE: (串行化) 禁止髒讀、不可重複讀和幻讀。

3.保存點(SavePoint)

JDBC定義了SavePoint接口,提供在一個更細粒度的事務控制機制。當設置了一個保存點後,能夠rollback到該保存點處的狀態,而不是rollback整個事務。
數據庫鏈接: Connection接口的setSavepoint和releaseSavepoint方法能夠設置和釋放保存點。

JDBC規範雖然定義了事務的以上支持行爲,可是各個JDBC驅動,數據庫廠商對事務的支持程度可能各不相同。若是在程序中任意設置,可能得不到想要的效果。爲此,JDBC提供了DatabaseMetaData接口,提供了一系列JDBC特性支持狀況的獲取方法。好比,經過DatabaseMetaData.supportsTransactionIsolationLevel方法能夠判斷對事務隔離級別的支持狀況,經過DatabaseMetaData.supportsSavepoints方法能夠判斷對保存點的支持狀況。

本文轉載自: 

http://www.javashuo.com/article/p-kihqmtmj-hx.html

http://blog.csdn.net/lhfqq/archive/2010/01/31/5274775.aspx

相關文章
相關標籤/搜索