問題を見つける 最近、以前のデータを入力していたときに、プログラムが突然次のエラーを報告しました。 [2017-02-10 13:12:06.678] [INFO] mysqlLog - tbl_playerdata_error を更新: { [エラー: ER_LOCK_DEADLOCK: ロックを取得しようとしたときにデッドロックが見つかりました。トランザクションを再起動してください] コード: 'ER_LOCK_DEADLOCK'、 エラー番号: 1213、 SQL状態: '40001', インデックス: 0 } 一見すると、MySQL にデッドロックの問題があることは明らかです。実際、上で実行しているプログラムは、テストサーバーで長時間問題なく実行されています。公式サーバーで MySQL のデッドロック問題が発生するのはなぜでしょうか。最初の反応は、データ量が多すぎる (300 万件以上のレコード) ということですが、それはあり得ません。それに、デッドロックはこれらのこととどう関係があるのでしょうか。きちんと解決する必要があるようです。 問題分析 私の分析は、現在公式サーバーのデータを処理しており、公式サーバーで操作しているユーザーが多いため、ユーザーがクエリやその他の操作を実行しているときに、私の側のデータ更新でデッドロックが発生するはずだということです(まず、InnoDB ストレージ エンジンを使用していることを説明します。ユーザー側のクエリやその他の操作によって必要なリソースがロックされ、私の側の更新によってユーザーの操作のリソースの一部もロックされたため、両側がもう一方の側がリソースを解放するのを待機し、デッドロックが発生しました)。 回避策 エラーコードがわかったら、まずMySQLの説明を確認してください。上記のエラー: 1213 SQLSTATE: 40001については、サーバーエラーコードとメッセージを参照してください。 メッセージ: ロックを取得しようとしたときにデッドロックが見つかりました。トランザクションを再開してください InnoDB は、トランザクションがデッドロックに遭遇し、自動的にロールバックされてアプリケーションが修正アクションを実行できる場合にこのエラーを報告します。このエラーから回復するには、このトランザクションのすべての操作を再度実行します。デッドロックは、ロック要求がトランザクション間で一貫性のない順序で到着すると発生します。ロールバックされたトランザクションはすべてのロックを解放し、他のトランザクションは要求したすべてのロックを取得できるようになりました。したがって、ロールバックされたトランザクションを再実行すると、他のトランザクションが完了するまで待機する必要がある場合がありますが、通常はデッドロックは再発しません。デッドロックが頻繁に発生する場合は、問題が発生しているさまざまなトランザクションまたはアプリケーション間で、ロック操作のシーケンス (LOCK TABLES、SELECT ... FOR UPDATE など) を一貫させます。詳細については、セクション14.8.5「InnoDB のデッドロック」を参照してください。 上記には2つの文があります: このエラーから回復するには、このトランザクションのすべての操作を再度実行してください。<br><br>デッドロックが頻繁に発生する場合は、問題が発生しているさまざまなトランザクションまたはアプリケーション間で、ロック操作のシーケンス (<code class="literal">LOCK TABLES</code>、<code class="literal">SELECT ... FOR UPDATE</code> など) を一貫しているようにしてください。 この 2 つの文では、デッドロックの対処方法についても説明しています。デッドロック エラーが発生した場合は、タイマーを使用して操作を再更新し、上記の問題を回避します。 さらに、Stack Overflow の回答を参照してください: http://stackoverflow.com/questions/2332768/how-to-avoid-mysql-deadlock-found-when-trying-to-get-lock-try-restarting-trans ほとんどのデッドロックを解決するのに役立つ簡単なトリックの 1 つは、操作を特定の順序で並べ替えることです。 2 つのトランザクションが反対の順序で 2 つのロックをロックしようとすると、デッドロックが発生します。 接続1: キー(1)をロックし、キー(2)をロックします。 接続2: キー(2)をロックし、キー(1)をロックします。 両方が同時に実行されると、接続 1 はキー (1) をロックし、接続 2 はキー (2) をロックし、各接続は他方がキーを解放するまで待機します -> デッドロック。 ここで、接続が同じ順序でキーをロックするようにクエリを変更した場合、次のようになります。 接続1: キー(1)をロックし、キー(2)をロックします。 接続2: キー(1)をロックし、キー(2)をロックします。 デッドロックを起こすことは不可能になります。 そこで私が提案するのは次のことです: 削除ステートメントを除いて、一度に複数のキーへのアクセスをロックする他のクエリがないことを確認してください。そのようなクエリがある場合 (おそらくあると思います)、WHERE in (k1,k2,..kn) を昇順に並べ替えます。 削除ステートメントを昇順で動作するように修正します。 変化 onlineusers から削除 WHERE datetime <= now() - 間隔 900 秒 に DELETE FROM onlineusers WHERE id IN (SELECT id FROM onlineusers WHERE datetime <= now() - INTERVAL 900 SECOND order by id) u; 覚えておくべきもう 1 つの点は、mysql のドキュメントでは、デッドロックが発生した場合、クライアントは自動的に再試行する必要があると示されていることです。このロジックをクライアント コードに追加できます (たとえば、この特定のエラーでは、諦める前に 3 回再試行します)。 参考: http://blog.sina.com.cn/s/blog_4acbd39c01014gsq.html 要約する 上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に少しでもお役に立てれば幸いです。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM をご愛顧いただき、ありがとうございます。 以下もご興味があるかもしれません:
|
この記事では、参考までに、シンプルなページカウントダウンを実装するためのJavaScriptの具体的...
デプロイされるプロジェクトが増えるにつれて、Tomcat にデプロイされるリリース パッケージも増え...
目次プロジェクトディレクトリDockerファイルファイルの展開画像を生成するコンテナを起動するウェブ...
目次1. 概要2. JSON基本ツール3. JSONパス式4. JSONを検索して変更する序文:長い...
1. Dockerネットワークカードを作成する [root@i ~]# brctl addbr d...
システムヘルプを表示help contents mysql> ヘルプコンテンツ; ヘルプ カテ...
開発中、優れたユーザー インターフェイスには常にいくつかのアニメーションが組み込まれます。 CSS ...
XQuery は、XML ドキュメントからデータを抽出するための言語です。 XQuery は、XML...
目次1. MySQLのインストール1.2 テーブル、データベース、ユーザーを作成する1.3 リモート...
1. 問題複数のフローティング要素は親要素の幅を拡張できず、親要素の高さが 0 になる可能性がありま...
オリジナルリンク: https://vien.tech/article/138序文私は、マークダウン...
このコードは水平マージを示しています。 <!DOCTYPE html PUBLIC "...
目次MySQL スレーブ ライブラリ Seconds_Behind_Master 遅延の概要1. 遅...
Linux のファイル権限まず、現在のディレクトリ内のファイルの内容を確認しましょう。 ls -l ...
目次デコレータパターンの紹介TypeScript のデコレータデコレータの使用デコレーターファクトリ...