ホームページ > データベース > mysql チュートリアル > MySQL オンライン ユーザー追跡システムで「ロックを取得しようとしているときにデッドロックが見つかりました」エラーを防ぐにはどうすればよいですか?

MySQL オンライン ユーザー追跡システムで「ロックを取得しようとしているときにデッドロックが見つかりました」エラーを防ぐにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-15 18:52:15
オリジナル
312 人が閲覧しました

How Can I Prevent

MySQL で「ロックを取得しようとしたときに見つかったデッドロック」を回避する

問題:

開発者は断続的な「ロックを取得しようとしたときにデッドロックが見つかりました。オンライン ユーザー アクティビティを追跡する InnoDB テーブルに INSERT を実行すると、トランザクションを再開してくださいというエラーが発生します。テーブルはページの更新時に更新され、cron ジョブによって 15 分ごとにクリアされます。

問題のクエリ:

  • 最初の訪問: INSERT INTO onlineusers (ip 、日時、ユーザー ID、ページ、エリア、タイプ) 値 (ip、now()、ユーザー ID、'/thispage'、 'thisarea', 3)
  • ページ更新: UPDATE onlineusers SET ip = ip、datetime = now()、userid = userid、page = '/thispage'、area = 'thisarea'、type = 3 WHERE id = 888
  • 15 分ごとの Cron ジョブ: DELETE FROM onlineusers WHERE datetime <= now() - INTERVAL 900 SECOND

解決策:

デッドロックを解決するには、トランザクションが一貫した順序でキーをロックすることが重要です。推奨される手順は次のとおりです:

  1. クエリ内のキーの順序:

    • 複数のキーをロックするすべてのクエリが昇順でロックされていることを確認します。の注文key.
  2. Sort Delete ステートメント:

    • 主キー値を取得するサブクエリを含めるように DELETE ステートメントを変更します。 (この場合は ID) を昇順で並べます。 this:
    DELETE FROM onlineusers
    WHERE id IN (
        SELECT id
        FROM onlineusers
        WHERE datetime <= now() - INTERVAL 900 SECOND
        ORDER BY id
    ) u;
    ログイン後にコピー
  3. 再試行メカニズム:

    • この特定のクライアント コードに再試行メカニズムを実装することを検討してください。エラーが発生し、限られた回数だけ自動的に再試行できるようになります。

以上がMySQL オンライン ユーザー追跡システムで「ロックを取得しようとしているときにデッドロックが見つかりました」エラーを防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート