標籤:事務 tar 聚集 key 作用 href 一個 案例分析 upd
mysql 中的 latch鎖和Tlock(事務鎖), DML加鎖規則,以及死結分析。
一.Latch和Tlock的關係
Latch:為保護臨界資源的正確性而設計,例如保護正在使用的記憶體頁面不被破壞等。
沒有死結檢測機制,輕量鎖,並且作用對象時記憶體頁面或是記憶體共用變數.
Tlock:事務鎖,作用對象是事務,有死結檢測機制.
在innodb內部,為了減少死結的發生機率,Latch不會等待Tlock.
線程擷取行鎖的流程:
在對行加鎖的時候會先對行所在的頁面添加lath,然後再對行添加Tlock,待對行添加完Tlock後再釋放頁面的Lath。
這種機制主要是為了保證線程擷取的行資料的一致性和完整性.
如果行被其他的線程佔有,線程先釋放頁面latch,等待行鎖,待擷取行鎖後會再次對頁面添加latch,查看頁面資料是否有改動,再次擷取改動後的行。
二.DML加鎖規則
DML加鎖的語句有,insert/update ... where ..../ delete from .. where .. / select * from
insert不添加鎖,但是在有唯一所以的時候,會對唯一索引做唯一性檢查(加s鎖,在將s鎖轉化為x鎖),都是行鎖。
update ... where.. / delete ... where ../select ... where lock in share mode / select .. where .. for update
(1).資料尋找走了索引,但是運算式為不等號,則會添加區間鎖(gap).
例如. > 10 ,則鎖定區間為(10,+~)
<10 ,則鎖定區間為(-~,10) .
(2).資料尋找走的唯一索引,並且運算式為等號(=),則添加行鎖(record lock but not gap) 。
(3).資料尋找為非唯一索引,並且運算式為等號,會添加區間鎖(record lock gap),會鎖定的區間為( ] ,允許更新,不允許插入.
重點:區間鎖是為了防止出現幻覺讀的,所以只阻塞插入操作.對更新不影響
三.死結案例分析.
(1).insert,並發插入相同的資料,並且插入欄位中有唯一鍵存在,
在正常的插入過程中是不會添加任何鎖的,但是在有唯一鍵的時候會對唯一鍵的欄位做唯一性檢查,在檢查的過程中會對記錄共用鎖定(S),
當多個線程對同一行添加共用鎖定(S)之後,會將共用鎖定(s)轉化為獨佔鎖定(X),此時就會相互等待,產生死結.
(2).update並發更新,更新的欄位有索引
線程一根據索引欄位更新一個行,線程二根據主鍵更新索引欄位.
此時線程一獲得了索引等待行 ,線程二獲得了行等待索引。
(3)delete,根據某一個唯一索引欄位並發刪除記錄。
過程非常複雜,詳情見一下連結:
http://www.cnblogs.com/sunss/p/3166550.html
(4).insert和delete並發,有非叢集索引
線程1根據某個非叢集索引欄位刪除資料,線程2插入相同的記錄。
線程1獲得了索引,等待行,線程2獲得了行,等待索引。
(5).insert 和update並發,有非叢集索引。
死結原理同4.
(6)delete 和update 並發.
原理同2.
死結案例串連:
innodb next-key lock引發的死結:
http://www.cnblogs.com/xhan/p/3701459.html
唯一鍵造成的死結:
http://www.cnblogs.com/sunss/p/3166550.html
mysql中的delete死結
http://hedengcheng.com/?p=844
http://dwchaoyue.blog.51cto.com/2826417/1749109
(轉)mysql 中的 latch鎖和Tlock(事務鎖), DML加鎖規則,以及死結分析