ホームページ > データベース > mysql チュートリアル > MySQL でのデッドロックを防ぐにはどうすればよいですか?

MySQL でのデッドロックを防ぐにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-14 07:51:11
オリジナル
832 人が閲覧しました

How Can I Prevent Deadlocks in MySQL?

MySQL でデッドロックを回避する方法

デッドロックはデータベース システムでよくある問題であり、重大なパフォーマンスの問題を引き起こす可能性があります。 MySQL では、2 つ以上のスレッドが同じリソースを逆の順序でロックしようとすると、デッドロックが発生します。

デッドロックについて

典型的なデッドロック シナリオを分析してみましょう:

  • 接続 1: キー(1)をロックしてからkey(2) をロックしようとします。
  • 接続 2: key(2) をロックしてから key(1) をロックしようとします。

両方の接続の場合同時に実行すると、両方がお互いにロックされたキーを解放するのを待つため、デッドロックが発生します。

回避デッドロック

デッドロックを防ぐには、接続がキーを同じ順序でロックすることが重要です。

クエリの並べ替え

  • デッドロックが発生しにくいクエリ: クエリの場合複数のキーをロックしないクエリの場合、順序は関係ありません。
  • デッドロックが発生しやすいクエリ: UPDATE ステートメントや DELETE ステートメントなど、複数のキーをロックするクエリの場合は、使用する WHERE 句の順序を変更します。キーの昇順。これにより、すべての接続にわたって一貫したロック順序が確保されます。

特定のケースでは、DELETE ステートメントを次のように変更する必要があります。

DELETE FROM onlineusers 
WHERE id IN (
    SELECT id FROM onlineusers
    WHERE datetime <= now() - INTERVAL 900 SECOND 
    ORDER BY id
) u;
ログイン後にコピー

このサブクエリのアプローチを使用すると、DELETE 操作は ID 列の昇順で行をロックし、

クライアント側の再試行ロジック

システムでまだデッドロックが発生する場合は、クライアント側の再試行ロジックを実装することをお勧めします。これには、デッドロック エラーが発生した場合に、クライアントが自動的に操作を複数回 (たとえば、3 回) 再試行することが含まれます。

以上がMySQL でのデッドロックを防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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