三分鐘掌握ACID、髒讀、幻讀、不可重複讀、事務隔離級別
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
相關文章
- 資料庫事務隔離級別– 髒讀、幻讀、不可重複讀資料庫
- 關於事務、事務的隔離級別以及對髒讀、不可重複讀、幻讀的理解
- MySQL 事務隔離實驗-認識:髒讀、不可重複讀、幻讀MySql
- MySQL事務(4種事務隔離級別、髒寫、髒讀、不可重複讀、幻讀、當前讀、快照讀、MVCC、事務指標監控)MySqlMVC指標
- 髒讀,幻讀,不可重複讀
- 【Mysql】資料庫事務,髒讀、幻讀、不可重複讀MySql資料庫
- 髒讀、幻讀和不可重複讀
- 髒讀、幻讀和不可重複讀?為啥?
- 什麼是髒讀,不可重複讀,幻讀
- 髒讀!幻讀!不可重複讀!mysql併發事務引發的問題MySql
- 一文詳解髒讀、不可重複讀、幻讀
- 事務四大特性理解,什麼是髒資料、髒讀、不可重複讀、幻覺讀
- 【每日鮮蘑】資料庫隔離級別、髒讀、幻讀、鎖等資料庫
- Mysql RC/RR隔離原理和區別 不可重複讀和可重複讀MySql
- 簡單聊聊mysql的髒讀、不可重複讀MySql
- 事務隔離級別讀書筆記分享筆記
- 事務ACID特性與隔離級別
- MySQL的可重複讀級別能解決幻讀嗎MySql
- MySQL 之隔離級別:可重複讀MySql
- ACID之I:事務隔離
- 為什麼mysql選可重複讀作為預設的隔離級別MySql
- 一文讀懂MySQL的事務隔離級別及MVCC機制MySqlMVC
- 一文徹底讀懂MySQL事務的四大隔離級別MySql
- [Mysql]事務/隔離級別MySql
- MySQL事務隔離級別MySql
- 事務、特性、隔離級別
- MySQL 事務隔離級別MySql
- PostgreSQL事務隔離級別SQL
- golang saas框架,資料庫級別隔離、讀寫分離Golang框架資料庫
- 理解MySQL事務隔離級別MySql
- 事務四種隔離級別
- MySQL的事務隔離級別MySql
- MySQL事務的隔離級別MySql
- SqlServer事務詳解(事務隔離性和隔離級別詳解)SQLServer
- Spring的事務管理(一) Spring事務管理的實現,事務的屬性(隔離級別,傳播行為,只讀)Spring
- 三分鐘圖解事務隔離級別,看一遍就懂圖解
- 3分鐘搞懂MySQL事務隔離級別及SET TRANSACTION影響事務MySql
- 事務的隔離級別與MVCCMVC