MySQL InnoDB中的事務隔離級別和鎖的關係

2021-10-11 21:55:06 字數 2551 閱讀 2841

隔離級別

髒讀(dirty read)

不可重複讀(nonrepeatable read)

幻讀(phantom read)

未提交讀(read uncommitted)

可能可能

可能已提交讀(read committed)

不可能可能

可能可重複讀(repeatable read)

不可能不可能

可能序列化(serializable )

不可能不可能

不可能1.讀未提交

事務1還沒提交,事務2就能讀到事務1修改的內容

2.讀已提交

讀乙個事務提交後的資料。

但是事務2在事務1提交前和提交後,讀的資料是不一樣的。e.g「不可重複讀」

事務1查詢,但是事務2又插入新的記錄,原先事務1再次查詢時,會把後來插入的記錄也讀出來。e.g「幻讀」

3.可重複讀

mysql幫我們解決掉了幻讀問題。

4.序列化

只允許同一條記錄進行修改。

mysql中鎖的種類很多,有常見的表鎖和行鎖,也有新加入的metadata lock等等,表鎖是對一整張表加鎖,雖然可分為讀鎖和寫鎖,但畢竟是鎖住整張表,會導致併發能力下降,一般是做ddl處理時使用。

行鎖則是鎖住資料行,這種加鎖方法比較複雜,但是由於只鎖住有限的資料,對於其它資料不加限制,所以併發能力強,mysql一般都是用行鎖來處理併發事務。這裡主要討論的也就是行鎖。

資料的讀取都是不加鎖的,但是資料的寫入、修改和刪除是需要加鎖的。

這是mysql中innodb預設的隔離級別。我們姑且分「讀」和「寫」兩個模組來講解。

a、讀####不可重複讀和幻讀的區別####

很多人容易搞混不可重複讀和幻讀,確實這兩者有些相似。但不可重複讀重點在於update和delete,而幻讀的重點在於insert。

如果使用鎖機制來實現這兩種隔離級別,在可重複讀中,該sql第一次讀取到資料後,就將這些資料加鎖,其它事務無法修改這些資料,就可以實現可重複讀了。但這種方法卻無法鎖住insert的資料,所以當事務a先前讀取了資料,或者修改了全部資料,事務b還是可以insert資料提交,這時事務a就會發現莫名其妙多了一條之前沒有的資料,這就是幻讀,不能通過行鎖來避免。需要serializable隔離級別 ,讀用讀鎖,寫用寫鎖,讀鎖和寫鎖互斥,這麼做可以有效的避免幻讀、不可重複讀、髒讀等問題,但會極大的降低資料庫的併發能力。

所以說不可重複讀和幻讀最大的區別,就在於如何通過鎖機制來解決他們產生的問題。

上文說的,是使用悲觀鎖機制來處理這兩種問題,但是mysql、oracle、postgresql等成熟的資料庫,出於效能考慮,都是使用了以樂觀鎖為理論基礎的mvcc(多版本併發控制)來避免這兩種問題。

每行資料通過事務id來識別

但是當事務id為300時,沒有一條id符合當前id,就要用到readview

在select的時候,裡面存的是還沒有提交的事務

讀已提交,每次讀會產生乙個readview,readview裡面存的是活躍的記錄,查詢時會排除這些記錄

實現方式都是通過版本鏈和readview,

區別在於readview的產生時間

讀已提交,是在每次select,都會產生乙個readview。

每次查詢開始,都把現在沒有提交的事務,都存在readview裡面。

比方,第二次查詢id200已經提交,那麼readview[100],減少了。

可重複讀,readview只會在第一次讀的時候產生。之後使用的readview都是第一次產生的readview

讀鎖、寫鎖

for update

加了寫鎖,但是還能夠select查詢

鎖必須在事務內部使用

事務結束之後,鎖也會被釋放

在read commited下

在repeatble read下

總結: repeatable read級別可以解決幻讀,解決的方式就是加了gap鎖。

MySQL innoDB的事務隔離

關於事務的特性?acid 原子性,一致性 隔離性 永續性。innodb 中的事務的隔離級別?讀提交 乙個事物在已提交的時候才可以被其他事務看到 可重複讀 乙個事務在執行過程中看到的資料,總是跟另個乙個事物在啟動時看到的資料是一致的,只要事務未提交都對其他事務是不可見的。讀未提交 這個事務還未提交就可...

MySQL InnoDB事務模型

事務的acid特性 原子性 一致性 隔離性 永續性。這部分不多說了,任何一本講資料庫理論的書籍裡邊都會有講。mysql innodb通過鎖來實現事務的一致性和隔離性,共實現了四種事務隔離級別 read uncommitted讀取未提交 某個session中的事務可以看到其他session的事務中尚未...

Mysql Innodb事務的隔離級別

隔離級別 髒讀 dirty read 不可重複讀 nonrepeatable read 幻讀 phantom read 解釋未提交讀 read uncommitted 可能可能 可能事務a執行期間能讀到事務b修改且沒有提交的資料。已提交讀 read committed 不可能可能 可能事務a執行期間...