[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