關鍵詞:一致性、隔離性、幻讀、
前言:
假設此時事務A和事務B同時執行。
一、事務的定義&&特性:
1、定義:
2、事務的特性:
詳見:https://blog.csdn.net/chosen0ne/article/details/10036775
二、事務的一致性與隔離性的分析:
1、一致性:
(1)定義:
事務保證系統從某一個一致性狀態轉變為另外一個一致性狀態。
(2)分析:
老梁向小梁轉賬,假設轉賬之前這大小梁的錢加起來總共是10000,那么老梁向小梁轉賬之后,不管這兩個賬戶怎么轉,老梁的錢和小梁的錢加起來的總額必須還是10000,這個就是事務的一致性。
2、隔離性:
(1)定義:
並發事務執行過程中,不同的事務之間相互隔離執行的一個特性。
(2)隔離級別:
事務的隔離強度:Read Uncommitted < Read Committed < Repeated Read < Serialization
詳見:https://baijiahao.baidu.com/s?id=1629344395894429251&wfr=spider&for=pc
(3)並發事務執行過程中會產生的三個問題:
(4)"隔離級別"與"產生的問題"的詳細分析:
①不同隔離級別會產生的問題:
- Read Uncommitted級別:臟讀、不重復讀、幻讀
- Read Committed級別:不重復讀、幻讀
- Repeated Read級別:幻讀
- Serialization級別:都不會產生
(5)不同隔離級別下的讀操作和寫操作下的讀和寫操作的區別:
前提:重點分析Repeatable Read級別和Serialization級別;innodb引擎。
- 事務A寫:會加X鎖,此時事務B肯定不能進行任何操作;
- 事務A讀:對於快照讀,通過MVCC來控制增刪改查等操作;對於當前讀,除了對當前記錄加鎖之外還需要結合gap鎖來對記錄的間隙加鎖以保證了事務B只能讀取數據而不能進行其他寫操作。
- 不管是讀還是寫,都是串行化的。事務A在操作的時候,事務B只能等待。
(6)如何實現Read Commit隔離級別下的效果:
①效果:當前事務只能讀其他事務已提交的記錄:
②分析:
InnoDB 支持行鎖,進行寫操作時加的是行級中的排他鎖,那么當其他事務訪問另一個正在update (除select操作外其他操作本質上都是寫操作)同一條記錄的事務時,事務的讀操作會被阻塞。所以只能等到記錄(其實是索引上的鎖)上的排他鎖釋放后才能進行訪問,也就是另一個事務提交之后才能夠訪問。這樣確實就實現read commited隔離級別的效果。
參考: