MySQLのデッドロック問題

この記事を書いたチーム:frontier

初めに

【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc.  詳細はこちらから>

データベースは複数のユーザーが使用する共有リソースです。複数のユーザーが同時にデータにアクセスすると、複数のトランザクションがデータベース内の同じデータに同時にアクセスします。
同時操作が制御されていない場合、誤ったデータが読み取られて保存され、データベースの一貫性が破壊される可能性があります。

MySQL デッドロックのシナリオ

1.トランザクションは複数のテーブルを同時に更新します

トランザクションが複数のテーブルを同時に更新し、異なる順序を使用すると、デッドロックが発生する可能性があります。たとえば、トランザクション 1 が最初にテーブルAを更新します。ロックを解放せずにテーブル Bを更新しようとしました。トランザクション 2が最初にテーブルBを更新します。ロックを解放せずにテーブル Aを更新しようとしました。この場合、2 つのトランザクションは互いのロックが解放されるのを待つことになり、デッドロックが発生します。

2.トランザクションのネスト

トランザクションが内部で別のトランザクションを開始し、内部トランザクションでテーブルを更新し、外部トランザクションもテーブルの同じ行を更新する必要がある場合、デッドロックが発生する可能性があります。外側のトランザクションは内側のトランザクションがロックを解放するのを待つ必要があり、内側のトランザクションは外側のトランザクションがロックを解放するのを待つ必要があるためです。

3.インデックスの順序が矛盾しています

デッドロックは、複数のトランザクションが異なる順序で同じデータ行にアクセスし、異なるインデックスを使用する場合に発生する可能性があります。たとえば、トランザクション A はインデックス 1 の順序でデータ行にアクセスし、トランザクション B はインデックス 2 の順序で同じデータ行セットにアクセスするため、2 つのトランザクション間でデッドロックが発生します。

4.異なるトランザクションが同じインデックスを同時に更新します

複数のトランザクションが同じインデックスを同時に更新すると、デッドロックが発生する可能性があります。これは、トランザクションがインデックスを更新するときに対応するロックを取得し、ロックを解放せずに他のデータを更新しようとするため、デッドロックが発生するためです。

【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>

Smallitのサービス