這是關於資料庫方面的知識,事務的acid分別是指:
原子性(atomicity)
原子性是指事務是乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
一致性(consistency)
事務前後資料的完整性必須保持一致。
隔離性(isolation)
事務的隔離性是多個使用者併發訪問資料庫時,資料庫為每乙個使用者開啟的事務,不能被其他事務的運算元據所干擾,多個併發事務之間要相互隔離。
永續性(durability)
永續性是指乙個事務一旦被提交,它對資料庫中資料的改變就是永久性的,接下來即使資料庫發生故障也不應該對其有任何影響。
舉幾個簡單的例子來解釋一下四個特點
原子性(atomicity)
a對b進行轉賬100元,要麼失敗,要麼同時成功,這就是原子性。
一致性(consistency)
假設a原本的賬戶是800元,b原本的賬戶是500元,通過a對b進行轉賬100元的操作後,a的賬戶應該是700元,b的賬戶應該是600元。一致性表示事務完成後,結果符合邏輯運算。
永續性(durability)
a向b轉賬100元
操作前 a:800,b:500
操作後 a:700,b:600
如果在操作前(事務還沒有提交)伺服器宕機或者斷電,那麼重啟資料庫以後,資料狀態應該為
a:800,b:500
如果在操作後(事務已經提交)伺服器宕機或者斷電,那麼重啟資料庫以後,資料狀態應該為
a:700,b:600
永續性就是表示事務結束後的資料不隨著外界原因導致資料丟失。
隔離性(isolation)
針對多個使用者同時操作,乙個事務不會對另乙個事務產生影響。
a對b轉賬的同時,c對b轉賬,此時,只有a對b的轉賬起了作用,因為這是ab事務排除了cb事務產生的影響,也就是說,經過一輪轉賬之後,b的賬戶是500+100=600元,而不是600+200=800元。但是注意,此時的c為1000-200=800元。
1. 隔離級別
(1)read_uncommitted(讀未提交)
可讀取未提交事務的運算元據,最低的隔離級別,一般都沒有用的。這種情況會出現髒讀。
(2)read_committed(讀已提交)
乙個事務等另乙個事務提交之後才可進行讀取,解決了髒讀問題,但會出現不可重複讀。
(3)repeatable_read(可重複讀)
讀取事務開啟的時候不能對資料進行修改,解決了不可重複讀問題,但是存在幻讀問題。
(4)serializable(序列化)
是最高的事務隔離級別,可以避免髒讀、不可重複讀與幻讀。但是這種事務隔離級別效率低下,比較耗資料庫效能,一般不使用。
2.如何合理的選擇隔離級別
可以根據需求設定資料庫的事務的級別。「讀未提交」一般沒用,「讀已提交」解決髒讀但存在不可重複讀,「可重複讀」解決了髒讀和不可重複讀,但會出現幻讀。序列化讀,都可以解決,但是需要注意的是事務級別越高效能越低。
mysql預設第三隔離級別。oracle預設第二隔離級別。
3.髒讀,幻讀,不可重複讀
在高併發的情況下,事務可能會出現:髒讀,幻讀,不可重複讀。
以下的data是指資料庫的名稱
(1)髒讀
出現原因:乙個事務讀取到了快取中另乙個事務未提交的髒資料。
例子:事務b對data進行了操作但是未提交事務,此時事務a對data進行讀取,並使用事務b修改後的資料進行業務處理。
(2)幻讀
出現原因:乙個事務在讀取資料時,另乙個事務插入了資料,導致上個事務第二次讀取資料時,資料不一致。
例子:事務a對data進行讀取,假設此時只有一條資料,事務b對data新增一條資料,此時data實際上有兩條資料,所以說事務a讀取的資料,是虛幻的,稱為幻讀。
(3)不可重複度
出現原因:讀取資料的同時可以進行修改。
例子:事務a、事務b同時對data進行訪問,事務a對data進行讀取,事務b對data進行修改,當事務a第一次對data進行讀取完後事務b提交,此時當事務a第二次讀取該資料時的資料就與第一次讀取的資料不同,這種情況稱為不可重複讀。
4.以下是方便理解隔離級別會出現的問題
關於事務的ACID簡述
首先,這篇部落格關於不可重複讀和幻讀的內容介紹的十分清晰 以下為自己理解 事務總結 事務的特性 acid 原子性 事務裡面的操作單元不可切割,要麼全部成功,要麼全部失敗 一致性 事務執行前後,業務狀態和其他業務狀態保持一致.隔離性 乙個事務執行的時候最好不要受到其他事務的影響 永續性 一旦事務提交或...
事務的ACID 屬性
事務的四大屬性acid即事務的原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 原子性 atomicity 原子性是指事務是乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。一致性 consistency 事務必須使資料...
事務ACID的實現
事務需要滿足acid特性,那在資料庫中,它是如何實現的?我們接下來的內容將一一介紹。其實我們在 mysql innodb引擎 mvcc併發控制 中談到了事務的隔離級別,但沒有談到怎樣實現隔離性。我們提到了要消除幻讀,一般的資料庫系統需要保證序列化的事務隔離級別,而mysql innodb在可重複讀的...