<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何閱讀死鎖日志

          共 4646字,需瀏覽 10分鐘

           ·

          2020-09-05 19:08

          來源:公眾號yangyidba


          一 前言
          ? ?
          工欲善其事必先利其器,前面分析了很多死鎖案例,并沒有詳細的介紹如何通過死鎖日志來診斷死鎖的成因。本文將介紹如何讀懂死鎖日志,盡可能的獲取信息來輔助我們解決死鎖問題。
          二 日志分析
          2.1 場景?
          為了更好的學(xué)習(xí)死鎖日志,我們需要提前了解死鎖場景
          MySQL 5.6 事務(wù)隔離級別為RR

          1. CREATE TABLE `ty`?(

          2. ??`id`?int(11)?NOT?NULL AUTO_INCREMENT,

          3. ??`a`?int(11)?DEFAULT NULL,

          4. ??`b`?int(11)?DEFAULT NULL,

          5. ??PRIMARY KEY?(`id`),

          6. ??KEY `idxa`?(`a`)

          7. )?ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4

          8. insert?into?ty(a,b)?values(2,3),(5,4),(6,7);

          2.2 測試用例

          T2

          T1

          begin;


          delete from ?ty where ?a=5;

          begin;


          delete from ?ty where ?a=5;

          insert into ty(a,b) values(2,10);



          delete from ?ty where ?a=5;

          ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
          2.3 我們通過show engine innodb status 查看的日志是最新一次記錄死鎖的日志。

          1. ------------------------

          2. LATEST DETECTED DEADLOCK

          3. ------------------------

          4. 2017-09-09 22:34:13 7f78eab82700

          5. ***?(1)?TRANSACTION:?#事務(wù)1

          6. TRANSACTION 462308399,?ACTIVE 33 sec starting index read?

          7. mysql tables?in?use 1,?locked 1

          8. LOCK?WAIT?2?lock?struct(s),?heap?size?360,?1 row?lock(s)

          9. MySQL thread id 3525577,?OS thread handle 0x7f896cc4b700,?query id 780039657 localhost root updating

          10. delete from ty where a=5

          11. ***?(1)?WAITING?FOR?THIS?LOCK?TO BE GRANTED:

          12. RECORD?LOCKS space id 219 page no 4 n bits 72 index `idxa`?of?table `test`.`ty` trx id 462308399 lock_mode X waiting

          13. ***?(2)?TRANSACTION:

          14. TRANSACTION 462308398,?ACTIVE 61 sec inserting,?thread declared inside InnoDB 5000

          15. mysql tables?in?use 1,?locked 1

          16. 5?lock?struct(s),?heap?size?1184,?4 row?lock(s),?undo log entries 2

          17. MySQL thread id 3525490,?OS thread handle 0x7f78eab82700,?query id 780039714 localhost root update

          18. insert?into?ty(a,b)?values(2,10)

          19. ***?(2)?HOLDS THE?LOCK(S):

          20. RECORD?LOCKS space id 219 page no 4 n bits 72 index `idxa`?of?table `test`.`ty` trx id 462308398 lock_mode X

          21. ***?(2)?WAITING?FOR?THIS?LOCK?TO BE GRANTED:

          22. RECORD?LOCKS space id 219 page no 4 n bits 72 index `idxa`?of?table `test`.`ty` trx id 462308398 lock_mode X locks gap before rec insert intention waiting

          23. ***?WE ROLL BACK TRANSACTION?(1)

          2.4 日志分析
          *** (1) TRANSACTION: #事務(wù)1
          TRANSACTION 462308399, ACTIVE 33 sec starting index read?

          事務(wù)編號為 462308399 ,活躍33秒,starting index read 表示事務(wù)狀態(tài)為根據(jù)索引讀取數(shù)據(jù)。常見的其他狀態(tài):

          1. fetching rows 表示事務(wù)狀態(tài)在row_search_for_mysql中被設(shè)置,表示正在查找記錄。

          2. updating?or?deleting 表示事務(wù)已經(jīng)真正進入了Update/delete的函數(shù)邏輯(row_update_for_mysql)

          3. thread declared inside InnoDB 說明事務(wù)已經(jīng)進入innodb層。通常而言 不在innodb層的事務(wù)大部分是會被回滾的。

          mysql tables in use 1,?說明當前的事務(wù)使用一個表。locked 1 表示表上有一個表鎖,對于DML語句為LOCK_IX
          LOCK WAIT 2 lock struct(s), heap size 360, 1 row lock(s)
          LOCK WAIT表示正在等待鎖, 2 lock struct(s) 表示trx->trx_locks鎖鏈表的長度為2,每個鏈表節(jié)點代表該事務(wù)持有的一個鎖結(jié)構(gòu),包括表鎖,記錄鎖以及auto_inc鎖等。本案例中2locks 表示IX鎖和 lock_mode X (Next-key lock)
          heap size 360 表示事務(wù)分配的鎖堆內(nèi)存大小,一般沒有什么具體的用處。
          1 row lock(s)表示當前事務(wù)持有的行記錄鎖/gap 鎖的個數(shù)。
          delete from ty where a=5 表示事務(wù)1在執(zhí)行的sql ,
          不過比較悲傷的事情是show engine innodb status 是查看不到完整的事務(wù)的sql 的,通常顯示當前正在等待鎖的sql。

          *** (1) WAITING FOR THIS LOCK TO BE GRANTED:

          RECORD LOCKS space id 219 page no 4 n bits 72 index `idxa` of table `test`.`ty` trx id 462308399 lock_mode X waiting

          RECORD LOCKS 表示記錄鎖,space id為219,page號4 ,n bits 72表示這個聚集索引記錄鎖結(jié)構(gòu)上留有72個Bit位

          表示事務(wù)1 正在等待表 ty 上的 idxa 的 X 鎖本案例中其實是Next-Key lock

          事務(wù)2的log 和上面分析類似,

          *** (2) HOLDS THE LOCK(S):

          RECORD LOCKS space id 219 page no 4 n bits 72 index `idxa` of table `test`.`ty` trx id 462308398 lock_mode X

          顯示了事務(wù)2 insert into ty(a,b) values(2,10)持有了a=5 的Lock mode X |LOCK_GAP ,不過我們從日志里面看不到 事務(wù)2 執(zhí)行的 delete from ?ty where ?a=5;這點也是造成DBA 僅僅根據(jù)日志難以分析死鎖的問題的根本原因。

          *** (2) WAITING FOR THIS LOCK TO BE GRANTED:

          RECORD LOCKS space id 219 page no 4 n bits 72 index `idxa` of table `test`.`ty` trx id 462308398 lock_mode X locks gap before rec insert intention waiting

          表示事務(wù)2的insert 語句正在等待插入意向鎖 lock_mode X locks gap before rec insert intention waiting (LOCK_X + LOCK_REC_GAP )

          這里需要各位注意的是鎖組合,類似lock_mode X waiting ,lock_mode X,lock_mode X locks gap before rec insert intention waiting 是我們分析死鎖的核心重點。如何理解鎖組合呢?

          首先我們要知道對于MySQL有兩種常規(guī)鎖模式

          LOCK_S(讀鎖,共享鎖)

          LOCK_X(寫鎖,排它鎖)

          最容易理解的鎖模式,讀加共享鎖,寫加排它鎖.

          有如下幾種鎖的屬性

          LOCK_REC_NOT_GAP ? ? ? ?(鎖記錄)

          LOCK_GAP ? ? ? ? ? ? ? ? ? ? ? ? (鎖記錄前的GAP)

          LOCK_ORDINARY ? ? ? ? ? ? ?(同時鎖記錄+記錄前的GAP 。傳說中的Next Key鎖)

          LOCK_INSERT_INTENTION(插入意向鎖,其實是特殊的GAP鎖)

          鎖的屬性可以與鎖模式任意組合。例如.

          lock->type_mode ? ? ? 可以是Lock_X 或者Lock_S?

          locks gap before rec ?表示為gap鎖:lock->type_mode & LOCK_GAP

          locks rec but not gap 表示為記錄鎖,非gap鎖:lock->type_mode & LOCK_REC_NOT_GAP

          insert intention ? ? ? ? ? 表示為插入意向鎖:lock->type_mode & LOCK_INSERT_INTENTION

          waiting ? ? ? ? ? ? ? ? ? ? ? 表示鎖等待:lock->type_mode & LOCK_WAIT

          三 小結(jié)

          ? 本文算是簡單的死鎖分析入門,能夠提供部分死鎖分析的所需要的技術(shù)知識。死鎖分析確是一門技術(shù)活兒,想要透徹的分析死鎖的成因,我們必須要了解造成死鎖的業(yè)務(wù)邏輯sql 的執(zhí)行場景,MySQL的鎖機制 ,各種鎖之間的兼容性,必要時還需要透徹的理解源碼。

          瀏覽 54
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美天堂在线观看 | 超碰人人国产 | 啪啪网站在线观看 | 国产日批视频 | 五月天三级 |