データベースの基礎
トランザクションの排他制御で使われる2相ロック方式の説明として、正しいものはどれか。
- A各トランザクションは、ロックをかける段階と解除する段階を何度繰り返してもよい。これにより、デッドロックが起きないことが保証される
- B読み出しにはロックをかけず、書き込みにだけロックをかける。これにより、ダーティリードを含むすべての問題が防げる
- C各トランザクションは、ロックを1つでも解除したら、それ以降は新たなロックをかけない。これにより、同時に実行しても直列に実行した場合と同じ結果になることが保証されるが、デッドロックは起こりうる
答えと解説を見る
正解:C. 各トランザクションは、ロックを1つでも解除したら、それ以降は新たなロックをかけない。これにより、同時に実行しても直列に実行した場合と同じ結果になることが保証されるが、デッドロックは起こりうる
2相ロック方式(2PL)では、各トランザクションが、必要なロックを次々にかけていく段階(成長相)と、ロックを解除していく段階(縮退相)の2つの段階を持ち、いったんロックを解除し始めたら、新たなロックはかけません。すべてのトランザクションがこの規則を守ると、同時に実行したときの結果が、トランザクションをある順番で1つずつ実行した場合と同じになること(直列化可能性)が保証されます。ただし、2つのトランザクションが互いに相手のロックの解除を待つデッドロックは防げないので、DBMSはデッドロックを検出して一方をロールバックするなどの対処をします。実際には、コミットするまで専有ロックを解除しない厳格な2相ロック方式がよく使われ、ほかのトランザクションがコミットされていないデータを読むことも防ぎます。
- A. ロックをかける段階と解除する段階を繰り返すのは2相ロック方式ではありません。また、2相ロック方式でもデッドロックは起こりえます。
- B. 読み出しにロックをかけないと、ほかのトランザクションが更新している途中のデータを読めてしまい、ダーティリードなどを防げません。
- C. 正しい。解除を始めたら新たなロックをかけないことで直列化可能性が保証されますが、デッドロックは起こりえます。