メインコンテンツへ
データベース

データベースの排他制御に関する記述として、適切なものはどれか。

ア.共有ロックが設定されているデータに対しては、他のトランザクションは共有ロックも専有ロックも取得できない。
イ.専有ロック(書き込みロック)中は、他のトランザクションが共有ロックを取得でき、データを読み取ることができる。
ウ.デッドロックとは、2つのトランザクションが互いに相手のロック解放を待ち続けて、どちらも処理を進められなくなる状態である。正解
エ.デッドロックを防ぐ最も一般的な方法は、すべてのロックを同時に取得せず、必要になるたびに順次取得することである。

解説

デッドロックは「交差点で東西南北の車が全員譲り合って誰も動けない」渋滞です。AがリソースXを持ったままYを待ち、BがYを持ったままXを待つ——どちらも永遠に待ち続けます。

なぜ ウ が正解か

デッドロックはトランザクションAがリソースXをロックしてYを待ち、同時にトランザクションBがリソースYをロックしてXを待つ状態で発生します。どちらも相手がロックを解放するのを待つため、外部介入(タイムアウト検知やデッドロック検出アルゴリズムによるロールバック)がないと永久に進まなくなります。

なぜ ア は間違いか

共有ロック中は他のトランザクションも共有ロックを取得できます。共有ロックは「みんなで読んでOK」という宣言であり、読み取り同士は競合しません。「共有ロックも取得できない」という記述は誤りです。取得できないのは専有ロック(書き込みロック)のみです。

なぜ イ は間違いか

専有ロック(排他ロック)中は他のトランザクションは共有ロックも専有ロックも取得できません。「専有中でも共有ロックを取得できる」は誤りです。専有ロックは「このリソースは私が独占する」という宣言です。

なぜ エ は間違いか

デッドロックを防ぐための方法としてよく使われるのは「すべてのトランザクションで同じ順序でロックを取得する(ロック順序の統一)」です。「必要になるたびに順次取得する」という説明は、むしろデッドロックが発生しやすい取得パターンであり、防止策として逆効果です。

出典: AI生成問題(学習用)