2 相ロッキングとデッドロック
トランザクション T1 は口座 A から口座 B へ,T2 は口座 B から口座 A へ振替を行う。T1,T2 は 2 相ロッキングプロトコルに従っており,次の順に処理が進んだ。 ① T1 が A の専有ロックを獲得して A を更新 ② T2 が B の専有ロックを獲得して B を更新 ③ T1 が B の専有ロックを要求 ④ T2 が A の専有ロックを要求 この後の状況として,適切なものはどれか。ここで,ロックを獲得できないトランザクションは,獲得できるまで待たされるものとする。
- ア2 相ロッキングプロトコルは直列化可能性を保証するので,③で T1 は待たされるが,④で T2 は A の専有ロックを獲得でき,T2 の終了後に T1 も B のロックを獲得して完了する。
- イT1 は①で A の更新を終えているので,③で B のロックを要求する前に A のロックを解放する。このため,④で T2 は A のロックを直ちに獲得でき,デッドロックにはならない。
- ウT1 は T2 が保持する B のロックの解放を,T2 は T1 が保持する A のロックの解放を待ち合うデッドロックとなり,いずれかのトランザクションをロールバックしなければ解消しない。
- エ③の時点で T1 が T2 のロックの解放待ちになるので,DBMS はこの時点でデッドロックが発生したと判断し,T1 をロールバックする。
正解と解説を見る
正解 ウ
この問題の基礎知識
- 2 相ロッキングは,ロックを獲得するだけの相と解放するだけの相に分け,いったんロックを解放したら新たなロックを獲得しない方式であり,直列化可能性を保証する。
- 2 相ロッキングはデッドロックを防止しない。デッドロックは,複数のトランザクションが互いに相手の保持するロックの解放を待ち,待ちが循環して進めなくなった状態である。
- DBMS は待ちグラフなどで待ちの循環を検出し,いずれかのトランザクションをロールバックしてデッドロックを解消する。一方が他方を待っているだけで循環がなければデッドロックではない。
- 専有ロック(排他ロック)が保持されている間,他のトランザクションはそのデータに共有ロックも専有ロックも獲得できない。
2 相ロッキングが保証するのは直列化可能性であり,デッドロックが起きないことは保証しない。A の専有ロックは T1 が保持したままなので,④で T2 は A のロックを獲得できない。
2 相ロッキングでは,いったんロックを解放した後は新たなロックを獲得できない。T1 はこの後 B のロックを獲得する必要があるので,その前に A のロックを解放することはできない。
2 相ロッキングでは獲得相の間はロックを解放しないので,T1 は A を,T2 は B を保持したまま互いの解放を待つ。2 相ロッキングはデッドロックを防止しないので,DBMS は待ちの循環を検出していずれかをロールバックさせる必要がある。
③の時点では T1 が T2 を待っているだけで,T2 は T1 を待っていないので待ちの循環はなく,T2 が終了すれば T1 は処理を続けられる。デッドロックになるのは,④で T2 が T1 を待ち,待ちが循環した時点である。
照合の根拠(6 件)
- イ(誤り): 獲得相ではロックを解放できず,解放後は新たなロックを獲得できない
A transaction must not release locks during the first phase, and must not obtain new locks during the second phase
OMG Concurrency Service Specification 1.0 · Section 1.4(新しいタブで開きます) - ア(誤り): 2 相ロッキングが保証するのは直列化可能性である(デッドロックの回避ではない)
Two-phase locking is sufficient to guarantee serializability, hence this technique is used by transactions.
OMG Concurrency Service Specification 1.0 · Section 1.4(新しいタブで開きます) - ア(誤り): T1 が A の専有ロックを保持しているので,T2 は A の専有ロックを獲得できない
Read locks conflict with write locks, and write locks conflict with other write locks.
OMG Concurrency Service Specification 1.0 · Section 1.3.1.1(新しいタブで開きます) - ウ(正解)・エ(誤り): 競合するロックの要求は保持者の解放まで待たされる
When a client requests a lock on a resource that cannot be granted because another client holds a lock on the resource in a conflicting mode, the client must wait until the holding client releases its lock.
OMG Concurrency Service Specification 1.0 · Section 1.3.1.3(新しいタブで開きます) - ウ(正解): ロックは完了(コミット又はアボート)まで保持されるので,互いに待ってコミットできない T1,T2 のロックは,いずれかをアボートしなければ解放されない
Typically, a transaction will retain all of its locks until the transaction is completed (either committed or aborted).
OMG Concurrency Service Specification 1.0 · Section 1.2.8(新しいタブで開きます) - ウ(正解): ロックを保持したまま待つ方式ではデッドロックが起こり得る
If more than one client holds a read lock on the resource, a deadlock will occur as soon as one of the clients requests a write lock on the resource.
OMG Concurrency Service Specification 1.0 · Section 1.3.1.1(新しいタブで開きます)
③の時点の待ちは T1→T2 だけで循環がない(エは誤り)。④で T2→T1 が加わり待ちが循環する。両者ともコミットできずロックは完了まで解放されないので,いずれかのロールバックが必要になる。