DBMSにおけるロックベースの同時実行制御の仕組みと主要プロトコル解説
ロックは、DBMS(データベース管理システム)において同時実行制御を維持するために不可欠な仕組みです。ロックベースの同時実行制御を採用するシステムでは、トランザクションは必要なロックを取得するまで、データの読み取りや書き込みを行うことができません。
ロックベースのプロトコルでは、主に次の2種類のロックが使用されます。
- バイナリロック(Binary Locks) – 「ロック中」か「アンロック中」の2つの状態しか取らない、最もシンプルなロックです。
- 共有ロック/排他ロック(Shared/Exclusive Locks) – 共有ロックは読み取り操作のみを行う場合に取得されます。データが変更されないため、複数のトランザクション間で共有できます。一方、排他ロックは書き込み操作を行う際に使用され、排他ロックを保持しているトランザクションだけがデータ値を変更できます。
代表的なロッキングプロトコルには、以下の4つがあります。
単純ロックプロトコル(Simplistic Lock Protocol)
書き込み操作を実行する前に、トランザクションが対象のデータ値に対してロックを取得します。書き込み操作の完了後、ロックを解放できます。以下は単純ロックプロトコルの実行例です。
| T1 | T2 |
|---|---|
| R(A) | |
| R(A) | |
| Lock(B) | |
| R(B) | |
| W(B) | |
| Unlock(B) | |
| Lock(C) | |
| R(C) | |
| W(C) | |
| Unlock(C) | |
| Commit | |
| Commit |
上記にはT1とT2という2つのトランザクションがあります。読み取り操作にはロックは不要ですが、書き込み操作の前に各トランザクションがロックを取得し、操作後に解放している点が特徴です。
2相ロッキングプロトコル(Two-Phase Locking Protocol)
2相ロッキングプロトコル(2PL)は、「成長フェーズ」と「縮小フェーズ」という2つのフェーズで構成されます。トランザクションは成長フェーズでのみロックを取得でき、縮小フェーズに入ると、すでに取得済みのロックを解放することはできますが、新しいロックを取得することはできません。排他ロックは「X」、共有ロックは「S」で表されます。以下は2相ロッキングプロトコルの実行例です。
| T1 | T2 |
|---|---|
| S(A) | |
| R(A) | |
| S(A) | |
| R(A) | |
| X(B) | |
| R(B) | |
| W(B) | |
| X(C) | |
| R(C) | |
| W(C) | |
| Unlock(C) | |
| Unlock(A) | |
| Unlock(B) | |
| Unlock(A) | |
| Commit | |
| Commit |
上記の例では、変数Aに対しては読み取り操作のみが行われるため、T1とT2は共有ロックを使ってAを共有しています。T1は書き込み操作のためにBに対する排他ロックを取得し、その後すぐに解放します。T2もCに対して同様の操作を行います。
厳格な2相ロッキングプロトコル(Strict Two-Phase Locking Protocol)
厳格な2相ロッキングプロトコル(Strict 2PL)は、通常の2相ロッキングプロトコルとよく似ていますが、決定的な違いが1つあります。それは、このプロトコルで取得されたすべての排他ロックは、トランザクションがコミットまたはアボートするまで保持し続けなければならないという点です。以下は厳格な2相ロッキングプロトコルの実行例です。
| T1 | T2 |
|---|---|
| S(A) | |
| R(A) | |
| S(A) | |
| R(A) | |
| X(B) | |
| R(B) | |
| W(B) | |
| X(C) | |
| R(C) | |
| W(C) | |
| Unlock(A) | |
| Unlock(A) | |
| Commit | |
| Unlock(B) | |
| Commit | |
| Unlock(C) |
上記の例でも、変数Aに対しては読み取り操作のみが行われるため、T1とT2は共有ロックを使ってAを共有しています。T1は書き込み操作のためにBに対する排他ロックを取得し、T2もCに対して同様に行います。排他ロックはトランザクションがコミットした後にのみ解放されますが、共有ロックにはそのような制約はありません。
完全な2相ロッキングプロトコル(Rigorous Two-Phase Locking Protocol)
完全な(Rigorous)2相ロッキングプロトコルは、2相ロッキングプロトコルおよび厳格な2相ロッキングプロトコルをさらに拡張したものです。ここでは、トランザクションが保持するすべてのロック(共有ロック・排他ロックの両方)は、トランザクションがコミットまたはアボートした後にのみ解放されます。以下は完全な2相ロッキングプロトコルの実行例です。
| T1 | T2 |
|---|---|
| S(A) | |
| R(A) | |
| S(A) | |
| R(A) | |
| X(B) | |
| R(B) | |
| W(B) | |
| X(C) | |
| R(C) | |
| W(C) | |
| Commit | |
| Unlock(A) | |
| Unlock(B) | |
| Commit | |
| Unlock(A) | |
| Unlock(C) |
上記の例でも、変数Aに対しては読み取り操作のみが行われるため、T1とT2は共有ロックを使ってAを共有しています。T1は書き込み操作のためにBに対する排他ロックを取得し、T2もCに対して同様に行います。共有ロックと排他ロックの両方が、トランザクションがコミットした後に初めて解放される点に注目してください。
各プロトコルの比較まとめ
- 単純ロックプロトコル: 書き込み前にロックを取得し、書き込み後すぐに解放する最も基本的な方式。
- 2相ロッキングプロトコル: 成長フェーズでロックを取得し、縮小フェーズで解放する。直列化可能性を保証する。
- 厳格な2相ロッキングプロトコル: 排他ロックのみをコミット/アボートまで保持する。コミット前の他トランザクションによるダーティリードを防げる。
- 完全な2相ロッキングプロトコル: すべてのロックをコミット/アボートまで保持する。最も厳格で、カスケードロールバックを完全に回避できる。
-
【iPhone】コントロールセンターで3Dタッチを活用する便利なショートカット術
Appleが圧力感知式のタッチ技術「フォースタッチ(Force Touch)」を初めて搭載したのはApple Watchでした。その後、AndroidスマートフォンメーカーのHuaweiが同様の機能を新機種に搭載したことを受け、AppleはiPhone 6sからこの技術を「3Dタッチ」として本格導入し、広く普及させました。 Appleはこのマルチタッチ機能を「3Dタッチ」と呼んでいます。画面を強く押し込むことで、普段よく使う操作や機能に素早くアクセスできる、画期的な操作方法です。iPhoneの画面を押し続けると、押したアプリで利用可能なショートカットが表示されます。 例えば、3Dタ
-
Surface ペンを PowerPoint リモコン代わりに使う方法 – KeyPenX でプレゼン操作を自由自在に
Surface ペンは Surface デバイスの大きな魅力のひとつです。Windows 10 でインク入力機能が大幅に強化されたことで、書き込みや描画、アプリの操作をより自然かつ直感的に行えるようになりました。 さらに、ペンの上部にあるボタンを使えば、シングルクリック・ダブルクリック・長押しのそれぞれにショートカットを割り当てることもできます。ただし、初期状態で設定できる動作はかなり限られていました。それが Windows 10 Anniversary Update によって変わり、インストール済みの UWP アプリや従来型(クラシック)アプリに対して、独自のペンショートカットを自由に割り当