MySQL深度解析 可重複讀的間隙鎖

2021-10-12 08:39:28 字數 1721 閱讀 4325

innodb的預設事務隔離級別是可重複讀

建乙個測試表:

create

table

`t`(

`id`

int(11)

notnull

,`c`

int(11)

default

null

,`d`

int(11)

default

null

,primary

key(

`id`),

key`c`

(`c`))

engine

=innodb

;insert

into t values(0

,0,0

),(5

,5,5

),(10

,10,10

),(15

,15,15

),(20

,20,20

),(25

,25,25

);

寫鎖(更新鎖):在對一行更新時(或者在select後加for update),對該行加寫鎖,加鎖期間其他行不可以查詢或修改該行。

間隙鎖(gap lock):間隙鎖 鎖的是兩個值之間的空隙。比如:比如文章開頭的表t,初始化插入了6個記錄,這就產生了7個間隙。

間隙鎖特性:跟間隙鎖產生衝突的,是「往這個間隙中插入一條記錄」的操作。間隙鎖之間不存在衝突關係。也就是說,間隙鎖可以重複疊加。這個特性可能會導致死鎖問題。

間隙鎖是在可重複讀隔離級別下才會生效的

ps:如果把隔離級別設定為讀提交的話,就沒有間隙鎖了。但同時,你要解決可能出現的資料和日誌不一致問題,需要把binlog格式設定為row。這也是現在不少公司使用的配置組合。

可以看到,session a裡執行了三次查詢,分別是q1、q2和q3。它們的sql語句相同,都是select * from t where d=5 for update。查所有d=5的行,而且使用的是當前讀,並且加上寫鎖。

mysql中,帶有for update的select語句會給掃瞄過的每一行記錄加寫鎖

mysql中,給記錄加寫鎖時,會把該記錄兩邊的間隙加間隙鎖

因此,t1時刻,sessiona執行的語句將給表t所有的行加寫鎖,t2時刻,sessionb的更新語句由於表t整個都加了寫鎖,所以會等到sessiona事務提交 釋放寫鎖後 才會執行。

t4時刻,sessionc的插入語句由於表t整個都加了間隙鎖,所以無法插入,會等到sessiona事務提交後 釋放間隙鎖後 才會執行插入操作。

mysql 可重複讀。

一 可重複讀 我們先看看現象,再分析原理。我的mysql版本是5.5。下面是一張表,只有一條資料,並且我開啟了事物 此時,另乙個事物將record加1,因此我在開啟乙個命令列客戶端,執行下面的命令 成功加1之後,實際上,資料庫中record肯定是2。然後回到之前的客戶端,再查一次 沒毛病,recor...

mysql可重複讀

mysql innodb的預設隔離級別是可重複讀,之前理解有些偏差,查閱一些資料後總結出幾點 首先有兩個概念 一致性檢視 當乙個事務開啟時,innodb會生成乙個檢視,這個檢視是邏輯檢視,通過undo log和row tranzaction id控制實現。在該事務的任何時間點,一致性檢視中的資料都是...

MySQL 的可重複讀

我在這裡分享一篇關於 mysql 的可重複讀介紹,講得挺好的,可以解決一些疑惑,鏈結在下方引用處。sql 1992 年標準關於幻讀 phantom 的解釋 乙個事務 t1 根據某些查詢條件 讀取某幾行資料,然後事務 t2 執行 sql 語句插入一行或多行滿足查詢條件 的資料 這時候如果事務 t1 重...