2017-04-19 14 views
0

2フェーズロックは、ロックフェーズ中にロックをアップグレードできます。しかし、私は次の例がT1とT2がデッドロックであると言った理由を知らない。 read_lock(x)がwrite_lock(x)にアップグレードできないのはなぜですか?2フェーズロックトランザクションのデッドロック

enter image description here

答えて

2

T1とT2は、互いの完全異なる、全く気付かなプロセスであるので、それらは、であるべきです。

T2プロセスの場合でも、「読み取りロックをXにアップグレードする」場合でも、T1に何が起こるかについては何の違いもありません.XのT2ロックが解除されるまで待機する必要があります。

そこで我々はまだT1がT2を待っている、と我々はまだT2 がT2だから我々はまだ待っている両方のプロセスを有するY.

へのロックを取得しようとする時点でT1待っ開始に備えていますもう一方はロックを解除します。デッドロック。あなたはT1とT2の両方に語る第三成分「ロックマネージャ」で描く場合

EDITはおそらく、問題を理解することが少し簡単です。このロックマネージャコンポーネントが通過する状態は、「ロックなし」、「Y上のT1によって保持される読み取りロック」、「Y上のT1によって保持される読み取りロック、およびX上のT2によって保持される読み取りロック」である。

最初にLock ManagerがX上のT1によるロック要求を拒否するように強制する後者のビットと、YでLock ManagerをT2にロック要求を拒否させる前のビット