私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
目次
4. データベースでデッドロックが発生するのはどのような状況ですか?
ロックは、データベース システムとファイル システムを区別する重要な機能です。ロック メカニズムは、共有リソースへの同時アクセスを管理するために使用されます。 MySQL データベースの InnoDB エンジンを例として、ロックの特徴を簡単に紹介します。
トランザクション T1 が行 r の共有ロックを取得した場合、読み取りによって行 r のデータが変更されないため、別のトランザクション T2 がすぐに行 r の共有ロックを取得できます。この状況はロックの互換性と呼ばれます。ただし、別のトランザクション T3 が行 r の排他ロックを取得したい場合は、トランザクション T1 と T2 が行 r の共有ロックを解放するのを待つ必要があります。この状況を呼びます。ロックは互換性がありません 。次の図は、共有ロックと排他ロックの互換性を示しています。X ロックはどのロックとも互換性がなく、S ロックは S ロックとのみ互換性があることがわかります。 S ロックと X ロックは両方とも行ロックであり、互換性とは同じレコード (行) 上のロックの互換性を指すことに注意することが重要です。
バツ | S | |
バツ | 互換性がありません | 互換性がありません |
S | 互換性がありません | 互換性がある |
ロックの粒度 : InnoDB ストレージ エンジンは、複数粒度のロックをサポートしています。これにより、トランザクションは行レベルのロックとテーブル レベルのロックを同時に持つことができます。さまざまな粒度でのロック操作をサポートするために、InnoDB ストレージ エンジンはインテンション ロックと呼ばれる追加のロック方法をサポートしています。インテンション ロックは、ロックされたオブジェクトを複数のレベルに分割します。インテンション ロックは、トランザクションがより細かい粒度でロックすることを意味します。
InnoDB ストレージ エンジンは、インテンション ロックの比較的単純な設計をサポートしており、そのインテンション ロックはテーブル レベルのロックです。設計の主な目的は、トランザクション内の次の行に要求されるロックのタイプを明らかにすることです。次の 2 種類のインテンション ロックをサポートします。
1. 共有ロック (IS ロック) を目的としており、トランザクションはテーブル内の特定の行に対して共有ロックを取得したいと考えています。
2. 意図された排他ロック (IX ロック)。トランザクションはテーブル内の特定の行に対して排他ロックを取得したいと考えています。
InnoDB ストレージ エンジンは行レベルのロックをサポートしているため、インテンション ロックはテーブル全体のスキャンを除き、実際にはリクエストをブロックしません。したがって、テーブルレベルのインテントロックと行レベルのロックの互換性は次のようになります。
は | 9 章 | S | バツ | |
は | 互換性がある | 互換性がある | 互換性がある | 互換性がありません |
9 章 | 互換性がある | 互換性がある | 互換性がありません | 互換性がありません |
S | 互換性がある | 互換性がありません | 互換性がある | 互換性がありません |
バツ | 互換性がありません | 互換性がありません | 互換性がありません | 互換性がありません |
ロックアルゴリズム: InnoDB ストレージ エンジンには、次の 3 つの行ロック アルゴリズムがあります。
1. レコード ロック: 単一行レコードをロックします。
2.ギャップロック:ギャップロック、ロック
3. Next-Key Lock: Gap Lock+Record Lock、範囲をロックし、レコード自体をロックします。
レコード ロックは常にインデックス レコードをロックします。 InnoDB ストレージ エンジン テーブルの作成時にインデックスが設定されていない場合、InnoDB ストレージ エンジンはロックに暗黙的な主キーを使用します。 Next-Key Lock は、Gap Lock と Record Lock を組み合わせたロック アルゴリズムです。Next-Key Lock アルゴリズムでは、InnoDB は行クエリにこのロック アルゴリズムを使用します。 Next-Key Lockを利用したロック技術はNext-Key Lockingと呼ばれており、ファントム問題(ファントムリーディング)の解決を目的とした設計ではありません。このロック テクノロジを使用すると、ロックされるのは単一の値ではなく範囲になります。これは Predict Lock の改良版です。
デッドロックについて : デッドロックとは、実行中にリソースの競合により複数のトランザクションが待ち状態になる現象を指します。外部からの力がなければ物事は前に進みません。
ロックのアップグレード :ロック エスカレーションとは、現在のロックの粒度を減らすことを指します。たとえば、データベースはテーブルの 1,000 行ロックをページ ロックにアップグレードしたり、ページ ロックをテーブル ロックにアップグレードしたりできます。
InnoDB ストレージ エンジンには、ロックのアップグレードの問題はありません。レコードごとに行ロックを生成するのではなく、逆にトランザクションごとにアクセスされるページごとにビットマップ方式でロックを管理します。したがって、トランザクションがページ内の 1 つのレコードをロックするか複数のレコードをロックするかに関係なく、コストは通常同じです。
InnoDB ストレージ エンジンには 3 つの行ロック アルゴリズムがあり、ギャップ ロック (Gap Lock) はそのうちの 1 つです。ギャップ ロックは範囲をロックするために使用されますが、レコード自体をロックするためには使用されません。その目的は、ファントム読み取りの問題を引き起こす可能性がある、複数のトランザクションが同じ範囲にレコードを挿入することを防ぐことです。
InnoDB の行レベルのロックは、インデックスのインデックス エントリをロックすることによって実装されます。 InnoDB は、インデックス条件を通じてデータが取得される場合にのみ行レベルのロックを使用します。それ以外の場合、InnoDB はテーブル ロックを使用します。
テーブル内の特定の行がロックされている場合、異なるトランザクションは異なるインデックスを使用して異なる行をロックできます。さらに、主キー インデックス、一意のインデックス、または通常のインデックスのいずれを使用する場合でも、InnoDB は行ロックを使用してデータをロックします。
デッドロックとは、実行中にリソースの競合により複数のトランザクションが待ち状態になる現象を指します。外部からの力がなければ物事は前に進みません。次の表は、デッドロックの典型的な状況を示しています。つまり、A は B を待ち、B は A を待ちます。このデッドロック問題は、と呼ばれます。AB-BA デッドロック。
時間 | セッションA | セッションB |
1 | 始める: | |
2 | mysql>SELECT * FROM t ここで、a = 1 の場合、UPDATE; ************1.行************ 1:1 セット内の1行(0.00秒) | 始める: |
3 | mysql>SELECT * FROM t ここで、a = 2 の場合、UPDATE; ************1.行************ 2:2 です セット内の1行(0.00秒) | |
4 | mysql>SELECT * FROM t ここで、a = 2 の場合、UPDATE; #待って | |
5 | mysql>SELECT * FROM t ここで、a = 1 の場合、UPDATE; エラー 1213(40001): ロックを取得しようとしたときにデッドロックが見つかりました。トランザクションを再開してください。 |
デッドロックの問題を解決する最も簡単な方法はタイムアウトすることです。つまり、2 つのトランザクションが互いに待機し、一方の待機時間が設定されたしきい値を超えると、トランザクションの 1 つがロールバックされ、待機中のもう 1 つのトランザクションは続行できます。
タイムアウト メカニズムに加えて、現在のデータベースでは通常、デッドロック検出に待機グラフ (待機グラフ) 方式も使用されます。これは、タイムアウト ソリューションよりもデッドロックを検出するためのより積極的なアプローチです。 このアプローチは、InnoDB ストレージ エンジンでも採用されています。 wait-for グラフでは、データベースに次の 2 種類の情報を保存する必要があります。
1. ロック情報リスト;
2. 取引待ちリスト。
上記のリンクリストを介してグラフを構築できます。このグラフにループがある場合は、デッドロックが発生していることを意味し、リソースが互いに待機します。これは、よりアクティブなデッドロック検出メカニズムです。各トランザクションがロックを要求して待機するときに、ループがあるかどうかを判断します。ループが存在する場合、一般的に、InnoDB ストレージ エンジンはトランザクションをロールバックすることを選択します。アンドゥの最小量。