三分鐘掌握ACID、髒讀、幻讀、不可重複讀、事務隔離級別

池劍迪發表於2020-10-19

ACID

原子性(Atomicity)
事務中的操作要麼都發生,要麼都不發生。
一致性(Consistency)
事務前後資料的完整性必須一致。
隔離性(Isolation)
事務之間要相互隔離。
永續性(Durability)

事務一旦提交,資料必須持久化且不受任何因素影響。

 

髒讀、幻讀、不可重複讀

髒讀

事務A讀取到事務B未提交的資料

不可重複讀

事務A中兩次讀取的資料內容不一致

幻讀

事務A兩次讀取的資料數量不一致

 

mysql隔離級別和髒讀、幻讀、不可重複讀的關係

 

髒讀

不可重複讀

幻讀

讀未提交

讀提交

×

可重複讀

×

×

可序列化

×

×

×

 

讀未提交

事務可讀取到其他事務未提交的資料,故髒讀、幻讀、不可重複讀均可能發生

 

讀提交

事務可讀取到其他事務已提交的資料,故髒讀不再發生

不可重複讀場景1:

事務A查詢記錄1得到money=1
事務B修改記錄1的money=2

事務B提交

事務A查詢記錄1得到money=2

幻讀場景2:

事務A查詢表1得到總行數為1
事務B新增一條記錄

事務B提交

事務A查詢表1得到的總行數為2

因此隔離級別為讀提交時,還是會發生不可重複讀或幻讀

 

可重複讀

事務讀取時建立一個快照,事務多次讀取時,資料從建立中的快照中獲取,故不可重複讀不再發生

但因快照只能快照當前已有資料,故幻讀的場景無法避免

 

可序列化

嚴格案遭事務的順序執行,故不存在髒讀、幻讀、不可重複讀

 

MVCC 多版本併發控制

每個事務都會生成遞增的版本號,mysql的每條資料都有各自隱藏的新增、刪除事務版本號欄位。

新增、修改會將當前事務的版本號賦值給該行資料的新增版本號

刪除會將當前事務的版本號賦值給該行資料的刪除版本號

 

每個事務只能查詢

新增版本號<當前事務版本號 (建立在事務啟動前)

刪除版本號為空或>當前事務版本號 (刪除在事務啟動後)

的資料

場景如下:

事務A開啟,版本號為1001

事務B開啟,版本號為1002

事務A第一次查詢表1得到總行數為100

事務B新增了10條記錄

事務B提交,新增的10條記錄的新增版本號為1002

事務A第二次查詢表1得到的總行數為100

 

 

相關文章