天天看點

事務的四個屬性ACID1. 原子性(Atomicity)2. 一緻性(Consistency)3. 隔離性(Isolation)4. 持久性(Durability)參考資料

事務四大特征:原子性,一緻性,隔離性和持久性。

1. 原子性(Atomicity)

一個原子事務要麼完整執行,要麼幹脆不執行。這意味着,工作單元中的每項任務都必須正确執行。如果有任一任務執行失敗,則整個工作單元或事務就會被終止。即此前對資料所作的任何修改都将被撤銷。如果所有任務都被成功執行,事務就會被送出,即對資料所作的修改将會是永久性的。

如果事務無法滿足原子性,那麼事務必然無法滿足一緻性。

因為一緻性是從邏輯上描述的,原子性是從實作上描述的。

2. 一緻性(Consistency)

一緻性代表了底層資料存儲的完整性。它必須由事務系統和應用開發人員共同來保證。事務系統通過保證事務的原子性,隔離性和持久性來滿足這一要求; 應用開發人員則需要保證資料庫有适當的限制(主鍵,引用完整性等),并且工作單元中所實作的業務邏輯不會導緻資料的不一緻(即,資料預期所表達的現實業務情況不相一緻)。例如,在一次轉賬過程中,從某一賬戶中扣除的金額必須與另一賬戶中存入的金額相等。

一緻性是從邏輯上來描述事務的。

3. 隔離性(Isolation)

隔離性意味着事務必須在不幹擾其他程序或事務的前提下獨立執行。換言之,在事務或工作單元執行完畢之前,其所通路的資料不能受系統其他部分的影響。

一言以蔽之,多線程得到的結果跟單線程得到的結果相同。

即,多個同時執行的事務不會因為執行順序不同導緻結果不同。

事務的隔離性有以下幾個級别:

  • Read Uncommitted:最低的隔離級别,什麼都不需要做,相當于沒有隔離。一個事務可以讀到另一個事務未送出的結果。所有的并發事務問題都會發生。
  • Read Committed:隻有在事務送出後,其更新結果才會被其他事務看見。可以解決髒讀問題,即執行一半的事務對其它事務的讀操作沒有影響。
  • Repeated Read:在一個事務中,對于同一份資料的讀取結果總是相同的,無論是否有其他事務對這份資料進行操作,以及這個事務是否送出。可以解決髒讀、不可重複讀。

    可重複讀,該隔離界别是多次讀取同一條記錄時,讀取結果相同。這是禁止了不可重複讀,實質上,當事務A讀取記錄r1時,不允許其他事務修改 r1,如果修改,需要等待事務A處理結束。說個額外有趣的,當事務A在修改資料時,發生了查詢怎麼辦?實際應用中,是給資料和查詢加了一個SCN (System change number),簡單的說,為每一個查詢添加一個時間戳,然後對比記錄的時間戳。

但是還是有問題,無法解決幻讀問題,比如事務A 将 T表 中所有工資不到 10000元 的員工的工資改為10000元,在事務A執行結束尚未送出時,事務B又插入了一條(或删除操作)工資不滿10000元的員工記錄,然後再送出事務A,事務B。事務A好像發生了幻覺,沒有操作成功一樣,這是因為“可重複讀”鎖定的是,已經讀取的記錄,而不是鎖定整張表(或者超出讀取範圍的資料),可重複讀限制了事務本身涉及資料的update行為,但是無法限制事務自身以外的資料。我們可以使用表鎖或者範圍鎖。

  • Serialization:事務串行化執行,隔離級别最高,犧牲了系統的并發性。可以解決并發事務的所有問題。

    通常,在工程實踐中,為了性能的考慮會對隔離性進行折中。

其中隻有serialization實作隔離性所有要求,在真正實作事務的隔離性。

但考慮到實踐,為了性能,資料庫廠商做出了這方面的妥協,讓使用者可以選擇隔離的級别。

不同的隔離級别可以解決不同階段的問題,是層層遞進,逐漸增強的關系。

隔離性為了解決的問題主要有三個(将事務的隔離級别和問題聯系在一起了解):

1、 髒讀(Drity Read):事務A修改了一個資料,但未送出,事務B讀到了事務A未送出的更新結果,如果事務A送出失敗,事務B讀到的就是髒資料。

Read Committed可以解決髒讀問題,但仍存在以下兩種問題。

2、不可重複讀(Non-repeatable read) : 在同一個事務中,對于同一份資料讀取到的結果不一緻。比如,事務B在事務A送出前讀到的結果,和送出後讀到的結果可能不同。不可重複讀出現的原因就是事務并發修改記錄,要避免這種情況,最簡單的方法就是對要修改的記錄加鎖,這導緻鎖競争加劇,影響性能。(另一種方法是通過MVCC可以在無鎖的情況下,避免不可重複讀。待了解。。)

Repeated Read可以解決不可重複讀問題和髒讀問題,但仍無法解決下面的問題。

##3、幻讀(Phantom Read) : 在同一個事務中,同一個查詢多次傳回的結果不一緻。事務A新增了一條記錄,事務B在事務A送出前後各執行了一次查詢操作,發現後一次比前一次多了一條記錄。幻讀僅指由于并發事務增加記錄導緻的問題,這個不能像不可重複讀通過記錄加鎖解決,因為對于新增的記錄根本無法加鎖。需要将事務串行化,才能避免幻讀。

Serialization解決了以上所有問題,但是性能效率較低。

通常來說,事務隔離級别越低,所需持有鎖的時間也就越短,并發性能也就越好。

4. 持久性(Durability)

持久性表示在某個事務的執行過程中,對資料所作的所有改動都必須在事務成功結束前儲存至某種實體儲存設備。這樣可以保證,所作的修改在任何系統癱瘓時不至于丢失。

參考資料

https://blog.csdn.net/lxqfirst/article/details/7977519

https://www.cnblogs.com/ws-astrologer/p/6681089.html

轉載于:https://www.cnblogs.com/weiyinfu/p/9161948.html