Java學習之事務四大特性和隔離級別


事務

事務(Transaction),一般是指要做的或所做的事情,這些事情必須全部都完成,或者造成的影響和改變全部都撤銷。

四大特性

Java中,事務有四個特性(ACID):原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。

1、原子性(Atomicity):操作這些指令時,要么全部執行成功,要么全部不執行。只要其中一個指令執行失敗,所有的指令都執行失敗,數據進行回滾,回到執行指令前的數據狀態。
(原子性保證事務內的操作要么都發生,要么都不發生。假如所有的操作都成功了,那么事務是成功的,只要其中任何一個操作失敗,那么事務會進行回滾。)

2、一致性(Consistency):事務的執行使數據從一個狀態轉換為另一個狀態,但是對於整個數據的完整性保持穩定。

(A和B一共有2000塊錢,無論他們兩個誰向誰轉賬,轉了幾次帳,始終不能少於或者多余2000塊錢。)

3、隔離性(Isolation):隔離性是當多個用戶並發訪問數據庫時,比如操作同一張表時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個並發事務之間要相互隔離。
(假如有兩個線程T1和T2,T2要么在T1開始之前結束,要么在T1結束之后開始,兩個線程不能互相影響。)

4、持久性(Durability):當事務正確完成后,它對於數據的改變是永久性的。
(A卡里有2000塊錢,當A從卡里取出500,在不考慮外界因素干擾的情況下,那么A的卡里只能剩1500。不存在取了500塊錢后,卡里一會剩1400,一會剩1500,一會剩1600的情況。)

並發造成的問題

1、臟讀:臟讀是指在一個事務處理過程里讀取了另一個未提交的事務中的數據。
(A的支付寶里有1000塊錢,想往銀行卡里提現500,此時已輸入密碼,顯示“銀行正在處理中”,這時候A的老婆想用A支付寶里的1000塊錢還花唄,結果發現剩下500,過了一會銀行因為網絡原因導致提現失敗,轉出的500塊錢又回到了支付寶,此時A的支付寶里還是原來的1000。在這期間,A的老婆看到支付寶里的“500”,就是臟讀。)

2、幻讀(虛讀):一個事務執行兩次查詢,第二次結果集包含第一次中沒有或某些行已經被刪除的數據,造成兩次結果不一致,只是另一個事務在這兩次查詢中間插入或刪除了數據造成的。幻讀是事務非獨立執行時發生的一種現象。
(假如此時有兩個線程T1和T2,T1把數據表中每一行的第一個字段都改成了A后,T2新增了一行數據,且第一個字段是B,然后T1再讀數據表的時候發現還有一行未被修改。)

3、不可重復讀:一個事務兩次讀取同一行的數據,結果得到不同狀態的結果,中間正好另一個事務更新了該數據,兩次結果相異,不可被信任。
(兩個線程T1和T2,T1把某一行中的第一個字段改成了A后(此時T1讀取的數據是A),T2又把此字段改成了B,然后T1再次讀取這個字段時發現數據是B,和第一次讀取的A不一樣。)

 

臟讀是在另一個事務未提交時讀取了數據,而幻讀和不可重復讀都是在另一個事務已提交后讀取了數據。

幻讀和不可重復讀的區別在於:幻讀着重在對數據的整體(例如整張表)而且主要發生在進行增加和刪除的操作時,而不可重復讀側重在具體的某一行或者某一個字段主要發生在修改數據時。

隔離級別

  • 未提交時讀 Read uncommitted(最低級別,任何情況都無法保證。)
  • 已提交后讀 Read committed(可避免臟讀的發生。)
  • 可重復讀 Repeatable read(可避免臟讀、不可重復讀的發生。)
  • 序列化(串行化) Serializable(可避免臟讀、不可重復讀、幻讀的發生。)

隔離級別越高,越能保證數據的完整性和一致性,但是對並發性能的影響也越大。對於多數應用程序,可以優先考慮把數據庫系統的隔離級別設為Read Committed。它能夠避免臟讀取,而且具有較好的並發性能。盡管它會導致不可重復讀、幻讀和第二類丟失更新這些並發問題,在可能出現這類問題的個別場合,可以由應用程序采用悲觀鎖或樂觀鎖來控制。大多數數據庫的默認級別就是Read committed,比如Sql Server 和 Oracle。 MySQL的默認隔離級別是Repeatable read。

補充:

1、事務隔離級別為讀提交時,寫數據只會鎖住相應的行。

2、事務隔離級別為可重復讀時,如果檢索條件有索引(包括主鍵索引)的時候,默認加鎖方式是next-key鎖;如果檢索條件沒有索引,更新數據時會鎖住整張表。一個間隙被事務加了鎖,其他事務是不能在這個間隙插入記錄的,這樣可以防止幻讀。

3、事務隔離級別為串行化時,讀寫數據都會鎖住整張表。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM