innodbステータスログでデッドロックを解読する際の問題


16

Microsoft ADO.NETコネクタからMySQLにアクセスしています。

ときどき、innodbステータスに次のデッドロックが発生し、問題の原因を特定できないことがあります。トランザクション(2)は同じロックを待機して保持しているように見えますか?

------------------------
LATEST DETECTED DEADLOCK
------------------------
110606  5:35:09
*** (1) TRANSACTION:
TRANSACTION 0 45321452, ACTIVE 0 sec, OS thread id 3804 starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 368, 1 row lock(s)
    MySQL thread id 84, query id 3265713 localhost 127.0.0.1 famdev Updating
    UPDATE people SET company_id = 1610, name = '<name>', password = '<hash>', temp_password = NULL, reset_password_hash = NULL, email = '<redacted>@yahoo.com', phone = NULL, mobile = '<phone>', iphone_device_id = 'android:<id>-<id>', iphone_device_time = '2011-06-06 05:35:09', last_checkin = '2011-06-06 05:24:42', location_lat = <lat>, location_long = -<lng>, gps_strength = 3296, picture_blob_id = 1190, authority = 1, active = 1, date_created = '2011-04-13 20:21:20', last_login = '2011-06-06 05:35:09', panic_mode = 0, battery_level = NULL, battery_state = NULL WHERE people_id = 3125
    *** (1) WAITING FOR THIS LOCK TO BE GRANTED:
    RECORD LOCKS space id 0 page no 11144 n bits 152 index `PRIMARY` of table `family`.`people` trx id 0 45321452 lock_mode X locks rec but not gap waiting
    Record lock, heap no 12 PHYSICAL RECORD: n_fields 25; compact format; info bits 0
    0: len 8; hex 8000000000000c35; asc        5;; 1: len 6; hex 000002b38ce6; asc       ;; 2: len 7; hex 00000002801f89; asc        ;; 3: len 8; hex 800000000000064a; asc        J;; 4: len 4; hex <data>; asc <name>;; 5: len 30; hex <data>; asc <data>;...(truncated); 6: SQL NULL; 7: SQL NULL; 8: len 16; hex <data>; asc <redacted>@yahoo.com;; 9: SQL NULL; 10: len 10; hex <data>; asc <phone>;; 11: len 30; hex <data>; asc android:<id>;...(truncated); 12: len 8; hex <data>; asc    J]  Z;; 13: len 8; hex <data>; asc    J]  Z;; 14: len 8; hex a39410acaa9b4340; asc       C@;; 15: len 8; hex <data>; asc     m S ;; 16: len 2; hex 8ce0; asc   ;; 17: len 8; hex 80000000000004a6; asc         ;; 18: len 4; hex 80000001; asc     ;; 19: len 1; hex 81; asc  ;; 20: len 8; hex <data>; asc    JR   ;; 21: len 8; hex <data>; asc    J]   ;; 22: len 1; hex 80; asc  ;; 23: SQL NULL; 24: SQL NULL;

    *** (2) TRANSACTION:
    TRANSACTION 0 45321448, ACTIVE 0 sec, OS thread id 3176 starting index read, thread declared inside InnoDB 500
    mysql tables in use 1, locked 1
    5 lock struct(s), heap size 1216, 2 row lock(s), undo log entries 1
    MySQL thread id 85, query id 3265714 localhost 127.0.0.1 famdev Updating
    UPDATE people SET company_id = 1610, name = '<name>', password = '<hash>', temp_password = NULL, reset_password_hash = NULL, email = '<redacted>@yahoo.com', phone = NULL, mobile = '<phone>', iphone_device_id = 'android:<id>-<id>-<id>-<id>', iphone_device_time = '2011-06-06 05:24:42', last_checkin = '2011-06-06 05:35:07', location_lat = <lat>, location_long = -<lng>, gps_strength = 3296, picture_blob_id = 1190, authority = 1, active = 1, date_created = '2011-04-13 20:21:20', last_login = '2011-06-06 05:35:09', panic_mode = 0, battery_level = NULL, battery_state = NULL WHERE people_id = 3125
    *** (2) HOLDS THE LOCK(S):
        RECORD LOCKS space id 0 page no 11144 n bits 152 index `PRIMARY` of table `family`.`people` trx id 0 45321448 lock mode S locks rec but not gap
        Record lock, heap no 12 PHYSICAL RECORD: n_fields 25; compact format; info bits 0
        0: len 8; hex 8000000000000c35; asc        5;; 1: len 6; hex 000002b38ce6; asc       ;; 2: len 7; hex 00000002801f89; asc        ;; 3: len 8; hex 800000000000064a; asc        J;; 4: len 4; hex <data>; asc <name>;; 5: len 30; hex <data>; asc <data>;...(truncated); 6: SQL NULL; 7: SQL NULL; 8: len 16; hex <data>; asc <redacted>@yahoo.com;; 9: SQL NULL; 10: len 10; hex <data>; asc <phone>;; 11: len 30; hex <data>; asc android:<id>;...(truncated); 12: len 8; hex <data>; asc    J]  Z;; 13: len 8; hex <data>; asc    J]  Z;; 14: len 8; hex a39410acaa9b4340; asc       C@;; 15: len 8; hex <data>; asc     m S ;; 16: len 2; hex 8ce0; asc   ;; 17: len 8; hex 80000000000004a6; asc         ;; 18: len 4; hex 80000001; asc     ;; 19: len 1; hex 81; asc  ;; 20: len 8; hex <data>; asc    JR   ;; 21: len 8; hex <data>; asc    J]   ;; 22: len 1; hex 80; asc  ;; 23: SQL NULL; 24: SQL NULL;

        *** (2) WAITING FOR THIS LOCK TO BE GRANTED:
        RECORD LOCKS space id 0 page no 11144 n bits 152 index `PRIMARY` of table `family`.`people` trx id 0 45321448 lock_mode X locks rec but not gap waiting
        Record lock, heap no 12 PHYSICAL RECORD: n_fields 25; compact format; info bits 0
        0: len 8; hex 8000000000000c35; asc        5;; 1: len 6; hex 000002b38ce6; asc       ;; 2: len 7; hex 00000002801f89; asc        ;; 3: len 8; hex 800000000000064a; asc        J;; 4: len 4; hex <data>; asc <name>;; 5: len 30; hex <data>; asc <data>;...(truncated); 6: SQL NULL; 7: SQL NULL; 8: len 16; hex <data>; asc <redacted>@yahoo.com;; 9: SQL NULL; 10: len 10; hex <data>; asc <phone>;; 11: len 30; hex <data>; asc android:<id>;...(truncated); 12: len 8; hex <data>; asc    J]  Z;; 13: len 8; hex <data>; asc    J]  Z;; 14: len 8; hex a39410acaa9b4340; asc       C@;; 15: len 8; hex <data>; asc     m S ;; 16: len 2; hex 8ce0; asc   ;; 17: len 8; hex 80000000000004a6; asc         ;; 18: len 4; hex 80000001; asc     ;; 19: len 1; hex 81; asc  ;; 20: len 8; hex <data>; asc    JR   ;; 21: len 8; hex <data>; asc    J]   ;; 22: len 1; hex 80; asc  ;; 23: SQL NULL; 24: SQL NULL;

        *** WE ROLL BACK TRANSACTION (1)

次のキーロックに関するこの記事を読みましたが、更新の選択を行っていないため、適用されないようです。

更新

今朝、私はこのデッドロックの根本原因であるかもしれないわずかに異なるデッドロック署名を発見しました。私がしている別の問題として、そのデッドロックを掲示し、物事をシンプルに保つこと。他の質問が原因であることを確認できれば、ここで更新します。


帯域幅とスループットを増やして回答を更新しました。
RolandoMySQLDBA

私は、自動コミットについて何かを私の答えを更新
RolandoMySQLDBA

ところで、このタイプの質問はDBAの注意を引き付ける必要があるため、この質問に対して+1を受け取ります。
-RolandoMySQLDBA

回答:


6

ここに私が見ているものがあります

3つのクエリが表示されますが、すべてほぼ同じです。

UPDATE people SET company_id = 1610, name = '<name>', password = '<hash>',
temp_password = NULL, reset_password_hash = NULL, email = '<redacted>@yahoo.com',
phone = NULL, mobile = '<phone>', iphone_device_id = 'android:<id>-<id>',
iphone_device_time = '2011-06-06 05:35:09', last_checkin = '2011-06-06 05:24:42',
location_lat = <lat>, location_long = -<lng>, gps_strength = 3296,
picture_blob_id = 1190,authority = 1, active = 1,
date_created = '2011-04-13 20:21:20',
last_login = '2011-06-06 05:35:09', panic_mode = 0, battery_level = NULL,
battery_state = NULL WHERE people_id = 3125;

違い

トランザクション1

iphone_device_time = '2011-06-06 05:24:42'、last_checkin = '2011-06-06 05:35:07'

トランザクション2

iphone_device_time = '2011-06-06 05:35:09'、last_checkin = '2011-06-06 05:24:42'

列の値が反転していることに注意してください。通常、2つの異なるトランザクションが2つのテーブルから2つのロックにアクセスし、TX1(トランザクション1)が行Aを取得してから行Bを取得し、TX2が行Bを取得してから行Aを取得すると、デッドロックが発生します。この場合、TX1とTX2は同じ行にアクセスするが、2つの異なる列を変更する(iphone_device_time、last_checkin)。

値は意味をなしません。5:24:42に、最後のチェックインは5:35:07でした。10分27秒後(5:35:07-05:24:42)、列の値は逆になります。

大きな問題は次のとおりです。TX1がほぼ11分間保持されるのはなぜですか?

これは実際には答えではありません。これは単なる帯域幅であり、私の全体です。これらの観察が役立つことを願っています。

更新2011-06-06 09:57

innodb_locks_unsafe_for_binlogに関するこのリンクをチェックしてください。これを読むことをお勧めする理由は、INNODBステータス表示で見た他の何かです。lock_mode X(排他ロック)およびlock_mode S(共有ロック)というフレーズは、同じ行に両方のロックが課されている(または課そうとしている)ことを示します。次の行のロックを行う内部シリアル化が行われる場合があります。デフォルトはOFFです。これを読んだ後、有効にすることを検討する必要があるかもしれません。

更新2011-06-06 10:03

この考え方を検討するもう1つの理由は、すべてのトランザクションがPRIMARYキーを通過しているという事実です。PRIMARYはInnoDBのクラスター化インデックスであるため、PRIMARYキーと行自体は一緒です。したがって、行とPRIMARY KEYの走査はまったく同じです。したがって、PRIMARY KEYのインデックスロックも行レベルロックです。

更新2011-06-06 19:21

auocommitの値を確認してください。自動コミットがオフの場合、2つの問題が発生する可能性があります

  1. 同じトランザクションで同じ行を2回更新する
  2. 2つの異なるトランザクションで同じ行を更新する

実際、質問で表示するSHOW ENGINE INNODB STATUSには、まさに両方のシナリオがあります。


ご意見ありがとうございます。それにも気づきました。同じ行の2つの列を変更するとデッドロックが発生する理由がわかりません。
RedBlueThing

更新いただきありがとうございます。設定を確認したところ、自動コミットがオンになっています(つまり、デフォルトは変更していません)。
RedBlueThing

@RedBlueThingトランザクション分離レベルを確認してください(変数はtx_isolationdev.mysql.com/doc/refman/5.5/en/…)。これを設定しない場合、デフォルトはREPEATABLE-READです。別のトランザクション分離レベルがこのユニークな状況に役立つ可能性があります。
RolandoMySQLDBA

ありがとう。私はそれをチェックしてあなたに戻ってきます。
頑張っ

今朝、ログで別のデッドロックを発見しました。物事を簡単にするために、それを別の質問として投稿しました。dba.stackexchange.com/questions/3223/...
RedBlueThing

1

Rolandoの答えは、確かに正しいソリューションへの道を私たちに導くのに役立ちました。ただし、最終的に自動コミット構成、分離レベル、またはinnodb_locks_unsafe_for_binlog構成を調整しませんでした。

この最初の質問で投稿したデッドロックログは、その後ここで見つけて投稿したデッドロックの結果であると考えています。これら2つのクエリの問題を解決して以来、デッドロックは発生していません。


私は解決策を見つけることができませんでしたが、私は助けることができて良かったです!!!
RolandoMySQLDBA

私の提案とランダムなMySQL babblings(+1)を検討していただきありがとうございます!!!
-RolandoMySQLDBA

@RolandoMySQLDBA問題ありません;)助けてくれてありがとう。
RedBlueThing
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.