[InnoDB]Mysql加鎖狀況

主要討論RR隔離級別,由於RC只是少了間隙鎖。html

1、innodb七種鎖

共享/排他鎖(Shared and Exclusive Locks)

1.共享鎖(Shared Locks,S鎖) 2.排他鎖(Exclusive Locks,X鎖)mysql

能夠一塊兒讀,讀寫/寫寫互斥。sql

意向鎖(Intention Locks)

1.意向共享鎖(intention shared lock,IS) 2.意向排它鎖(intention exclusive lock,IX).net

看起來像表級鎖,解決表級鎖和行級鎖的衝突。 意向鎖之間兼容。 事務在請求S鎖和X鎖前,須要先得到對應的IS、IX鎖。htm

S X
IS 兼容 互斥
IX 互斥 互斥

行鎖

記錄鎖(Record Locks) 單條索引記錄上加鎖,record lock鎖住的永遠是索引,而非記錄自己。若是沒有顯示索引,innodb會建立隱式的彙集索引。blog

間隙鎖(Gap Locks) 鎖住一個索引區間(開區間)。 鎖住索引記錄的區間,或第一條索引記錄以前的範圍,或者最後一條索引記錄以後的範圍。索引

臨鍵鎖(Next-Key Locks) 記錄鎖與間隙鎖的組合,它的封鎖範圍,既包含索引記錄,又包含索引區間(左開右閉區間)。事務

插入意向鎖(Insert Intention Locks) 一種特殊的間隙鎖。 兩個事務只要插入的行沒有衝突,即便在同一間隙,也能夠插入。ci

鎖兼容矩陣get

Gap Insert Intention Record Next-Key
Gap 兼容 兼容 兼容 兼容
Insert Intention 衝突 兼容 兼容 衝突
Record 兼容 兼容 衝突 衝突
Next-Key 兼容 兼容 衝突 衝突

存在Insert Intention 鎖時,申請Gap鎖是容許的;可是存在Gap鎖時,申請Insert Intention鎖時是被阻止的。

自增鎖(AUTO-INC Locks)

表級鎖,多個事務同時插入時,保證AUTO_INCREMENT列遞增。

2、Sql加鎖狀況

普通select

1.讀未提交,讀提交,可重複讀 不加鎖,快照讀 2.串行化,普通select會升級爲select ... in share mode

加鎖select

select ... for update select ... in share mode 1.惟一索引,惟一條件 記錄鎖(Record Locks) 2.其餘的查詢條件和索引條件 間隙鎖(Gap Locks)與臨鍵鎖(Next-Key Locks)

update與delete

1.惟一索引,惟一條件 記錄鎖(Record Locks) 2.其餘, 排他臨鍵鎖(Next-Key Locks)

insert

排它鎖、同時,會在插入區間加插入意向鎖(insert intention lock)

參考:
dev.mysql.com/doc/refman/…
dev.mysql.com/doc/refman/…
mp.weixin.qq.com/s/tmkRAmc1M…
blog.csdn.net/zhanghongzh…
narcissusoyf.iteye.com/blog/163730…

相關文章
相關標籤/搜索