mysql innodb支持的鎖類型
排他/共享鎖(Share and Exclusive Locks)
共享鎖(share Locks):共享鎖之間不互斥,但是共享鎖和排他鎖之間互斥(S鎖)
排他鎖(exclusive Locks):排他鎖和任何鎖都互斥(X鎖)
意向鎖 (Intention Locks)
innodb 為了支持多粒度鎖機制(multiple granularity locking)及行級鎖和表級鎖,而引入意向鎖概念,意向鎖是指在將來某個時刻事務要添加共享/排他鎖,意向鎖是一個表級鎖(table-level locking),意向鎖之間相互兼容
意向鎖主要用來標志底層資源是否被使用,例如:一個更新語句先在表(上層資源)上添加意向鎖,然后在更新的記錄上(底層資源)添加寫鎖;這個時候第二個更新表結構的語句先判斷表上的意向鎖,就不需要再判斷行的寫鎖或讀鎖是否存在了。
在事務申請讀寫鎖之前先申請對應的意向鎖。
X鎖對應IX鎖
S鎖對應IS鎖
- 意向共享鎖(Intention share locks[IS]):事務要對表添加共享IS鎖
- 意向排他鎖(Intention Exclusive Locks[IX]):事務要對表添加排他IX鎖
select ... lock in share mode; 添加共IS鎖
select ... for udpate; 添加IX鎖,有索引的情況下添加行鎖
事務要獲取某些記錄的S/X鎖之前,先獲取對應表的IS/IX鎖,意向鎖之間相互兼容
| 是否互斥 | IS | IX |
|---|---|---|
| IS | 否 | 否 |
| IX | 否 | 否 |
意向鎖和共享互斥鎖之間的關系
| 是否互斥 | S | X |
|---|---|---|
| IS | 否 | 是 |
| IX | 是 | 是 |
間隙鎖 (Gap Locks)
封鎖記錄中間的數(shù)據(jù),或者是第一條索引之前的范圍,或者是最后一條索引之后的范圍,
select * from lock_example where id between 0 and 10 for udpate;
可以防止在0到10之間插入數(shù)據(jù),如果將事務降級到(read commit RC)該鎖會失效
記錄鎖 (Record Locks)
鎖定具體的表中的記錄,在獲取記錄鎖的過程中應該是先獲取意向鎖在說去對應記錄了的讀寫鎖。
臨鍵鎖 (Next-key Locks)
臨鍵鎖是記錄鎖和間隙鎖的組合,大于記錄所小于間隙鎖的范圍。
臨鍵鎖鎖定的是記錄鎖對應的索引對應的間隙拆分,然后分別加鎖。
例如:記錄鎖對應的索引有:10、11、13、20,其對應的間隙鎖如下:
(negative infinity, 10],(10,11],(11,13],(13,20],(20,positive infinity)
默認情況下在RR隔離級別上生效,主要用來防止幻讀
插入意向鎖 (Insert Intention Locks)
插入意向鎖是INSERT操作之前進行的間隙鎖定,如果一個INSERT操作獲取到了一個相同的間隙,如果這兩個INSERT操作沒有放在相同的索引位置,則不需要對彼此進行等待。
例如:當兩個INSERT操作鎖定了4,7索引的間隙,事務1插入索引5,事務2插入索引6則這兩個操作可以同時進行
自增所 (Auto-inc Locks)
在自增插入時才會使用到該鎖,innodb_autoinc_lock_mode配置可以用來平衡
生成自增數(shù)據(jù)量和插入數(shù)據(jù)的并發(fā)量。
不同的數(shù)據(jù)庫隔離級別鎖之間會表現(xiàn)不同的行為
讀取未提交內容(read uncommitted):最低級別的隔離級別,未提交內容也可以被讀取到,會出現(xiàn)臟讀(Dirty Read),該隔離級別沒有明顯的性能優(yōu)勢。
讀取提交內容(read committed):不是Mysql默認隔離級別,一個事務只能看到已提交事務所作的改變及一個事務中的select結果集會有不同。
可重復讀(repeatable read):msyql數(shù)據(jù)庫的默認隔離級別,該隔離級別可以確保同一個事務中的相同的select語句可以獲取到相同的查詢結果。但是該該隔離級別會導致幻讀(Phantom Read)問題,及該隔離級別的查詢當進行范圍查詢時另一個事務如果新增了一條記錄,則該記錄會被查詢出來。Mysql的innodb使用多版本并發(fā)控制(MVCC multiversion concurrency control)解決了這個問題。
串行化(Serilizable):最高級別的隔離級別,將所有的事務強制串行化
查看死鎖日志(Mysql Innodb引擎)
show engine innodb status\G;
參考:
https://www.aneasystone.com/archives/2017/10/solving-dead-locks-one.html
http://www.itdecent.cn/p/996236d91048
https://blog.csdn.net/dreamvyps/article/details/84500543