Dbms-concurrency-control

提供:Dev Guides
移動先:案内検索

DBMS-同時実行制御

複数のトランザクションを同時に実行できるマルチプログラミング環境では、トランザクションの同時実行性を制御することが非常に重要です。 並行トランザクションのアトミック性、分離、およびシリアライズ可能性を保証する同時実行制御プロトコルがあります。 同時実行制御プロトコルは、大きく2つのカテゴリに分類できます-

  • ロックベースのプロトコル
  • タイムスタンプベースのプロトコル

ロックベースのプロトコル

ロックベースのプロトコルを備えたデータベースシステムは、適切なロックを取得するまで、トランザクションがデータを読み書きできないメカニズムを使用します。 ロックは2種類あります-

  • バイナリロック-データアイテムのロックには2つの状態があります。ロックまたはロック解除されています。
  • 共有/排他-このタイプのロックメカニズムは、使用法に基づいてロックを区別します。 書き込み操作を実行するためにデータ項目でロックが取得された場合、それは排他ロックです。 複数のトランザクションが同じデータ項目に書き込むことを許可すると、データベースが一貫性のない状態になります。 データ値が変更されていないため、読み取りロックは共有されます。

利用可能なロックプロトコルの4つのタイプがあります-

単純なロックプロトコル

単純なロックベースのプロトコルにより、トランザクションは「書き込み」操作が実行される前にすべてのオブジェクトのロックを取得できます。 トランザクションは、「書き込み」操作の完了後にデータ項目のロックを解除する場合があります。

事前請求ロックプロトコル

事前請求プロトコルは、操作を評価し、ロックが必要なデータ項目のリストを作成します。 実行を開始する前に、トランザクションは必要なすべてのロックを事前にシステムに要求します。 すべてのロックが許可されている場合、トランザクションはすべての操作が終了したときに実行され、すべてのロックが解除されます。 すべてのロックが許可されていない場合、トランザクションはロールバックされ、すべてのロックが許可されるまで待機します。

事前請求

二相ロッキング2PL

このロックプロトコルは、トランザクションの実行フェーズを3つの部分に分割します。 最初の部分では、トランザクションの実行が開始されると、必要なロックの許可を求めます。 2番目の部分は、トランザクションがすべてのロックを取得する場所です。 トランザクションが最初のロックを解放するとすぐに、3番目のフェーズが開始されます。 このフェーズでは、トランザクションは新しいロックを要求できません。獲得したロックを解放するだけです。

二相ロック

2フェーズロックには2つのフェーズがあります。1つは*成長*で、すべてのロックがトランザクションによって取得されます。 2番目のフェーズは縮小されており、トランザクションによって保持されているロックが解放されます。

排他(書き込み)ロックを要求するには、トランザクションは最初に共有(読み取り)ロックを取得してから、排他ロックにアップグレードする必要があります。

厳密な二相ロック

Strict-2PLの最初のフェーズは2PLと同じです。 最初のフェーズですべてのロックを取得した後、トランザクションは引き続き正常に実行されます。 ただし、2PLとは対照的に、Strict-2PLは使用後にロックを解除しません。 Strict-2PLは、コミットポイントまですべてのロックを保持し、一度にすべてのロックを解放します。

厳密な二相ロック

Strict-2PLには、2PLのようにカスケードアボートがありません。

タイムスタンプベースのプロトコル

最も一般的に使用される同時実行プロトコルは、タイムスタンプベースのプロトコルです。 このプロトコルは、システム時刻または論理カウンターをタイムスタンプとして使用します。

ロックベースのプロトコルは、実行時にトランザクション間で競合するペア間の順序を管理しますが、タイムスタンプベースのプロトコルは、トランザクションが作成されるとすぐに動作を開始します。

すべてのトランザクションにはタイムスタンプが関連付けられており、順序はトランザクションの経過時間によって決まります。 0002時刻に作成されたトランザクションは、その後に来る他のすべてのトランザクションよりも古いものになります。 たとえば、0004でシステムに入るトランザクション「y」は2秒若いため、優先順位は古いものに与えられます。

さらに、すべてのデータ項目に最新の読み取りおよび書き込みタイムスタンプが付与されます。 これにより、システムはデータ項目に対して最後の「読み取りおよび書き込み」操作がいつ実行されたかを知ることができます。

タイムスタンプ順序付けプロトコル

タイムスタンプ順序付けプロトコルは、競合する読み取りおよび書き込み操作でトランザクション間のシリアル化を保証します。 これは、トランザクションのタイムスタンプ値に従って、競合するタスクのペアを実行するプロトコルシステムの責任です。

  • トランザクションT〜[.small]#i#〜のタイムスタンプは、TS(T〜[.small]#i#〜)として示されます。
  • データ項目Xの読み取りタイムスタンプは、R-timestamp(X)で示されます。
  • データ項目Xの書き込みタイムスタンプは、W-timestamp(X)で示されます。

タイムスタンプ順序付けプロトコルは次のように機能します-

トランザクションTiがread(X)操作を発行する場合-

  • TS(Ti)<W-timestamp(X)の場合
  • 操作が拒否されました。
  • TS(Ti)> = W-timestamp(X)の場合
  • 操作が実行されました。
  • すべてのデータ項目のタイムスタンプが更新されました。

トランザクションTiがwrite(X)操作を発行する場合-

TS(Ti)<R-timestamp(X)の場合

  • 操作が拒否されました。

TS(Ti)<W-timestamp(X)の場合

  • 操作は拒否され、Tiはロールバックされました。

それ以外の場合、操作が実行されました。

トーマスの書き込みルール

このルールは、TS(Ti)<W-timestamp(X)の場合、操作は拒否され、T〜[.small]#i#〜はロールバックされます。

タイムスタンプの順序付けルールを変更して、スケジュールビューをシリアル化できるようにすることができます。

T〜[.small]#i#〜をロールバックする代わりに、「書き込み」操作自体は無視されます。