ブロックするとシリアル化可能になります
专栏内容:
- 手書きデータベース toadb
このコラムでは、誰でもできるように、ゼロから開発する方法や開発の手順、開発の原則、遭遇した問題などを中心に紹介します。そして、それを必要とするすべての人が参加できるように、一緒に開発することができます。
この列は定期的に更新され、対応するコードも定期的に更新されます。各段階での学習を容易にするために、各段階のコードにタグが付けられます。
开源贡献:
個人のホームページ:私のホームページ
コミュニティの管理: < /span>モットー: 空が強いとき、紳士は自己向上に努め、地形が弱いとき、紳士は自分の信念を持ち続ける優しさで富を築くオープン ソース データベース
記事ディレクトリ
序文
情報技術の急速な発展に伴い、データはさまざまな分野に浸透し、現代社会の最も重要な資産の一つとなっています。このビッグデータの時代では、データベース理論がデータの管理、保存、処理において重要な役割を果たしています。しかし、多くの読者はデータベース理論について混乱しており、適切なデータベースを選択する方法、効果的なデータベース構造を設計する方法、大量のデータを処理および管理する方法がわかりません。したがって、このコラムは、読者がデータベース テクノロジをよりよく理解して適用できるように、データベース理論の包括的かつ詳細なガイドを提供することを目的としています。
データベース理論は、データを効果的に管理、保存、取得する方法を研究するものです。現代の情報化社会においては、データ量が飛躍的に増大しており、これらのデータをいかに効率的に処理・管理するかが重要な課題となっています。同時に、クラウド コンピューティング、モノのインターネット、ビッグ データなどの新興テクノロジーの継続的な発展に伴い、データベース理論の重要性がますます顕著になっています。
したがって、このコラムを共有することで、データベース理論に関するすべての人の知識と理解を向上させ、興味のある友人を助けることができればと考えています。
概要
最も一般的に使用されるスケジューラ構造であるデータベース同時実行制御は、データベース アクセス要素をロックして逆シリアル化動作を防止します。
簡単に言うと、トランザクションが要素にアクセスするとき、最初にそのロックを取得して、他のトランザクションによる逆シリアル化されたアクセスを回避します。
この記事では、スケジューラがシリアル化可能なアクション シーケンスを生成できるようにするこのブロッキング モードとその問題点を紹介します。
ロック
並行プログラミングでは、特定のコード領域の実行をシリアル化できるさまざまなタイプのシステム変数を使用します。これらのシステム変数は、データベースにロックを実装するためにデータベースでも使用されます。
により、ロックで保護されたデータベース要素にシリアル方式でのみアクセスできるようになります。ロックはアクセス前に取得されます。取得が異なる場合は、待機または中止することしかできません。ロックが取得されると、操作は次のようになります。操作が完了したらロックを解除してください。
実際のデータベースにはさまざまな種類のロックが存在しますが、詳しくは後ほど説明します。
スケジューラにロックを使用する場合、両方の構造でロックが正しい必要があります。
- トランザクション構造、
第一に、読み取りおよび書き込み操作は、ロック後、ロックを解放する前にのみ実行できます。
第二に、要素がロックされている場合は、使用後にロックを解放する必要があります。
- スケジュール構造
同じ要素は 1 つのトランザクションによってのみロックできますが、ロックしようとする別のトランザクションは中止されるか待機します。これはデータベースごとに異なる方法で実装されます。
ブロックスケジューラ
以下の図は、ブロック化されたスケジューラー モデルのアーキテクチャを示しています。
単純なロック モデルを使用してそれを導入しましょう。データベース要素ごとに 1 種類のロックしか持たない場合、読み取りと書き込みの前にロックを取得し、使用後にロックを解放する必要があります。
スケジューラが決定を下すために、スケジューラには各データベース要素のロック ステータスを記録するロック テーブルがあります。ロックがある場合、それはトランザクションがデータベース要素を使用しており、他のトランザクションがそれにアクセスできないことを意味します。
- 例は次のとおりです。
トランザクション T1 | トランザクション T2 | データA | データB |
---|---|---|---|
25 | 25 | ||
ロック(A);読み取り(A); | |||
A = A + 100 | |||
書き込み(A);ロック解除(A); | 125 | ||
ロック(A)、読み取り(A) | |||
A = A*2 | |||
書き込み(A);ロック解除(A) | 250 | ||
ロック(B);読み取り(B); | |||
B = B*2 | |||
書き込み(B);ロック解除(B); | 50 | ||
ロック(B);読み取り(B); | |||
B = B + 100 | |||
書き込み(B);ロック解除(B); | 150 |
この例では、スケジューラがトランザクション アクセスにロックを追加し、トランザクションが同じデータベース要素にシリアルにアクセスしているにもかかわらず、最終スケジュールはシリアル化できず、最終ステータスが矛盾しているという興味深い現象がわかります。
この説明は単なるブロック化であり、例の結果は競合のシリアル化可能な結果ではありません。
2段階のロックダウン
ここでは、2 フェーズ ロック (2PL) と呼ばれるロック条件を導入します。この驚くべき条件の下では、トランザクション スケジューリングは競合シリアル化可能であることが保証されます。
原理
2段階の封鎖とロック解除には以下の条件を満たす必要があります。
- 各トランザクションでは、すべてのブロック要求がすべてのロック解除要求よりも前に行われる必要があります。
ここでトランザクションは 2 つの段階に分かれており、
- 最初の段階はブロック段階であり、この段階では、アクセスする必要のあるデータベース要素が順番にロックされます。
- 第 2 段階はロック解除段階であり、この段階ではそれ以上のロック要求はできず、ロックは順番に解放されます。
2 段階のブロッキングは、トランザクションの一貫性と同様に、トランザクション内のアクションの順序を制限します。この条件を満たすトランザクションは、2 段階のブロッキング トランザクションと呼ばれます。
- 例
次に、2PL に従ってスケジュールした後、上記の例をもう一度見てみましょう。
トランザクション T1 | トランザクション T2 | データA | データB |
---|---|---|---|
25 | 25 | ||
ロック(A);読み取り(A); | |||
A = A + 100 | |||
書き込み(A);ロック(B);ロック解除(A); | 125 | ||
ロック(A)、読み取り(A) | |||
A = A*2 | |||
書き込み(A); | 250 | ||
ロック(B); 拒否されました | |||
読み取り(B); | |||
B = B + 100 | |||
書き込み(B);ロック解除(B); | 125 | ||
ロック(B);ロック解除(A);読み取り(B); | |||
B = B*2 | |||
書き込み(B);ロック解除(B); | 250 |
2PL 条件を満たすスケジュールを設定した後、最終結果は競合シリアル化可能であり、2 つのトランザクションをシリアル実行した場合と同じ結果であることがわかります。
分析する
2段階のロックダウンはどのように機能しますか?
実際、注意深く観察すると、トランザクションの実行順序は最初のロック解除の順序と一致していることがわかります。つまり、トランザクションはロック解除の順序で各データベース要素に対して連続的に実行され、シリアル実行の効果が保証されます。 . 競合の直列化可能性が達成されます。
もちろん帰納法で厳密に証明できるのでここでは詳しく述べません。
デッドロック
2 段階のブロッキングにより、トランザクション スケジュールの競合がシリアル化可能になる可能性がありますが、デッドロックという未解決の問題があります。つまり、スケジューラは複数のトランザクションに別のトランザクションが保持するロックを待機させ、そのトランザクションは前のトランザクションが保持するロックを待機する必要があります。
例は次のとおりです。
トランザクション T1 | トランザクション T2 | データA | データB |
---|---|---|---|
25 | 25 | ||
ロック(A);読み取り(A); | |||
ロック(B);読み取り(B); | |||
A = A + 100 | |||
B = B*2 | |||
書き込み(A); | 125 | ||
書き込み(B); | 50 | ||
ロック(B)が拒否されました | |||
ロック(A)が拒否されました |
さて、どちらのトランザクションも下方向に進み続けることはできず、両方とも永遠に待つことになりますが、これは次の導入部で共有され、この問題は解決されます。
要約する
ブロッキング モードを使用すると、スケジューラは競合しながらシリアル化可能なスケジューリングを生成できますが、各トランザクションに複数のデータベース要素が関与する場合、デッドロックの危険性があります。
終わり
応援していただき誠にありがとうございます。閲覧中は貴重なコメントを忘れずに残してください。励みになると思ったら、いいねと保存をお願いします。さらに頑張ります!
著者のメールアドレス:[email protected]
間違いや脱落があった場合は、指摘してお互いに学び合ってください。