MySQL デッドロックのオンライン迅速なトラブルシューティング ソリューション

理由:

        複数の SQL セッションの場合、リソースの競合により、両方がロックが解放されるのを待っているため、この時点でデッドロックが発生します。

mysql ロックの種類:

        共有ロック、読み取りロック、S ロック: 複数のトランザクションが同じデータのロックを共有でき、読み取りのみ可能で書き込みはできません。
        排他ロック、書き込みロック、Xロック:同時に1つのトランザクションのみが取得でき、ロックされているデータは他のトランザクションから変更できません。

        インテンション ロック ix は、
        トランザクション A がユーザー テーブルのレコード r を変更し、レコード r に行レベルの排他ロック (X) を与え、同時にユーザー テーブルにインテンション排他ロック (IX) を与えます。このとき、トランザクション B は、
        ユーザー テーブルに対するテーブル レベルの排他ロックをブロックします。このように、インテント ロックは行ロックとテーブル ロックの共存を実現し、トランザクション分離の要件を満たします。

例:     

t1:
        トランザクションを開始します。
        更新のために id=30 の fenqu から * を選択します。
        テスト セット コード = 30、id = 31 を更新します。

t2:
        トランザクションを開始します。
        select * from fenqu where id=31 を更新用に選択します。
        テスト セット コード = 31、id = 30 を更新します。

t1は30をロックした後に31を変更し、t2は31をロックした後に30を変更します。このとき
、30と31は両方とも排他ロックがかかっているため、相手が解放するのを待っている状態となり、デッドロックが発生します。

迅速なトラブルシューティング計画:

オプション 1:

        テーブルクエリ

        mysql 独自のライブラリ INFORMATION_SCHEMA には、ロックに関する 2 つのテーブルがあります。
        INNODB_LOCKS: InnoDB トランザクションが要求したがまだ取得していない各ロック、および別のトランザクションを阻止するトランザクションによって保持されている各ロックに関する情報を提供します。
        INNODB_LOCK_WAITS: ブロックされた InnoDB トランザクションごとに 1 つ以上の行が含まれ、リクエストしたロックとそのリクエストをブロックしているロックを示します。

        SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

         トランザクション ID 249187 は ID 249119 のロックによってブロックされています

オプション II:

        ログクエリ

        エンジンの INNODB ステータスを表示します。

        

3番目の解決策:

        Alibaba Cloud サービスを使用している場合。

        DAS 用 ApsaraDB -> インスタンスの選択 -> リアルタイム パフォーマンス -> ロック分析 -> すぐに診断; 

        

 

おすすめ

転載: blog.csdn.net/weixin_56766616/article/details/127785994
おすすめ