1. 程式人生 > >[InnoDB]Mysql加鎖情況

[InnoDB]Mysql加鎖情況

一、innodb七種鎖

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

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

可以一起讀,讀寫/寫寫互斥。

意向鎖(Intention Locks)

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

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

S X
IS 相容 互斥
IX 互斥 互斥

行鎖

記錄鎖(Record Locks)
單條索引記錄上加鎖,record lock鎖住的永遠是索引,而非記錄本身。如果沒有顯示索引,innodb會建立隱式的聚集索引。

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

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

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

鎖相容矩陣

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

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

自增鎖(AUTO-INC Locks)

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

二、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)

感謝:
https://dev.mysql.com/doc/refman/5.5/en/innodb-locks-table.html
https://dev.mysql.com/doc/refman/5.6/en/innodb-locking.html#innodb-auto-inc-locks
https://mp.weixin.qq.com/s/tmkRAmc1M_Y23ynduBeP3Q
https://blog.csdn.net/zhanghongzheng3213/article/details/53436240
http://narcissusoyf.iteye.com/blog/1637309