MySQLデッドロックのトラブルシューティングと解決

mysql デッドロックを引き起こす4つの条件:

1. 相互に排他的な状態:リソースは、1つのプロセスだけが占有でき、2つ以上のプロセスは占有できません。

 

2. 非プリエンプティブル条件:プロセスによってすでに取得されたリソースは、使用される前にプリエンプトできず、使用後にのみ解放できます。

 

3. 所有アプリケーション条件:プロセスはすでに少なくとも1つのリソースを維持し、他のリソースを要求しましたが、このリソースは他のプロセスによって占有されており、すでに占有しているリソースを解放しません

 

4. 循環待機状態:デッドロックが発生すると、リソースのプロセスループが形成される必要があります。プロセスセット{P1 P2 P3} であり、P1 リクエストP2のリソースの所有、P2の要求P3のリソースの所有、P3 要求P1のリソースが占有しました


デッドロックを解決するためのソリューション

最初の:

1. テーブルをロックするかどうかを問い合わせます

In_use> 0のOPEN TABLESを表示します。

 

2. クエリプロセス(SUPER 権限がある場合は、すべてのスレッドを表示できます。それ以外の場合は、自分のスレッドしか表示できません)

完全なプロセスリストを表示します。

 

3. プロセスIDを強制終了します(上記のコマンドのid 列)。

キルプロセスID


第二種:

1. ロックされたトランザクションを表示します

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

 

2. プロセス殺す言及ID上(すなわち、上記のコマンドtrx_mysql_thread_idのカラム

キルプロセスID


分析:

1. データベースの分離レベルを表示します(通常はRR REPEATABLE-READ ):

mysql> @@ tx_isolationを選択します。

mysql> select @@ global.tx_isolation;

 

2 のInnoDB エンジンの状態--- デッドロック情報があるだろう(のMyISAM ストレージエンジンがステートメントをデッドロックされません)

mysql> SHOW ENGINE INNODB STATUS;

3 mysql 自動コミットです更新はスタックされません。自動コミットの値を確認してください

mysql> @@ autocommit;を選択します。

1 は自動送信を意味します。0 は自動送信を行わないことを意味します。

データベースのautocommit = 0 が見つかった場合は、修正します。

おすすめ

転載: blog.51cto.com/9625010/2486571