原子性(Atomicity)
事務中的操作要麼都發生,要麼都不發生。
一致性(Consistency)
事務前後資料的完整性必須一致。
隔離性(Isolation)
事務之間要相互隔離。
永續性(Durability)
事務一旦提交,資料必須持久化且不受任何因素影響。
髒讀
事務A讀取到事務B未提交的資料
不可重複讀
事務A中兩次讀取的資料內容不一致
幻讀
事務A兩次讀取的資料數量不一致
| 髒讀 | 不可重複讀 | 幻讀 |
讀未提交 | √ | √ | √ |
讀提交 | × | √ | √ |
可重複讀 | × | × | √ |
可序列化 | × | × | × |
讀未提交
事務可讀取到其他事務未提交的資料,故髒讀、幻讀、不可重複讀均可能發生
讀提交
事務可讀取到其他事務已提交的資料,故髒讀不再發生
不可重複讀場景1:
事務A查詢記錄1得到money=1
事務B修改記錄1的money=2事務B提交
事務A查詢記錄1得到money=2
幻讀場景2:
事務A查詢表1得到總行數為1
事務B新增一條記錄事務B提交
事務A查詢表1得到的總行數為2
因此隔離級別為讀提交時,還是會發生不可重複讀或幻讀
可重複讀
事務讀取時建立一個快照,事務多次讀取時,資料從建立中的快照中獲取,故不可重複讀不再發生
但因快照只能快照當前已有資料,故幻讀的場景無法避免
可序列化
嚴格案遭事務的順序執行,故不存在髒讀、幻讀、不可重複讀
每個事務都會生成遞增的版本號,mysql的每條資料都有各自隱藏的新增、刪除事務版本號欄位。
新增、修改會將當前事務的版本號賦值給該行資料的新增版本號
刪除會將當前事務的版本號賦值給該行資料的刪除版本號
每個事務只能查詢
新增版本號<當前事務版本號 (建立在事務啟動前)
且
刪除版本號為空或>當前事務版本號 (刪除在事務啟動後)
的資料
場景如下:
事務A開啟,版本號為1001
事務B開啟,版本號為1002
事務A第一次查詢表1得到總行數為100
事務B新增了10條記錄
事務B提交,新增的10條記錄的新增版本號為1002
事務A第二次查詢表1得到的總行數為100