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 が見つかった場合は、修正します。