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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/184959.html
標籤:其他
下一篇:索引的代價
