REPEATABLE READ 共有・専有ロック
ロックさん
(No.1)
平成29年午後1問2を解いていて疑問に思いましたので質問致します。
この問題の設問2(1)のように、ISOLATIONレベルがREPEATABLE READの場合において、
同一トランザクション内で同一資源に対して共有ロック⇒専有ロックの順序でロックをかけることは可能なのでしょうか?
共有ロックに対し専有ロックをかけることは不可能だと思っていました。
共有ロックに対し専有ロックが不可なのは、トランザクション間のみの話ということでしょうか?
この問題の設問2(1)のように、ISOLATIONレベルがREPEATABLE READの場合において、
同一トランザクション内で同一資源に対して共有ロック⇒専有ロックの順序でロックをかけることは可能なのでしょうか?
共有ロックに対し専有ロックをかけることは不可能だと思っていました。
共有ロックに対し専有ロックが不可なのは、トランザクション間のみの話ということでしょうか?
2021.09.05 21:38
GinSanaさん
★DB ゴールドマイスター
(No.2)
この投稿は投稿者により削除されました。(2021.09.05 22:11)
2021.09.05 22:11
GinSanaさん
★DB ゴールドマイスター
(No.3)
>同一トランザクション内で同一資源に対して共有ロック⇒専有ロックの順序でロックをかけることは可能なのでしょうか?
他人の共有ロックがあるならば、解除されていなければできません。自分しか共有ロックをかけていないならば、可能です。
「他人のかけた共有ロックに対し専有ロックをかけることは不可能」で、それができないからこそ、デッドロックになるのです。
トランザクションAによる在庫引当APがある行に共有ロックを掛けたとします。
次にトランザクションBによる在庫引当APが同じ行に共有ロックを掛けたとします。
共有ロックが掛かっている間、他のトランザクションからの対象行の参照は可能であり、更新は共有ロックの解放待ちとなるから、参照は可能です。
しかし、更新はAPIの終了待ちですから、トランザクションBの在庫引当APが参照に成功すれば、トランザクションAの在庫引当APは、更新のための専有ロックは掛けられないわけで待ちが発生するわけです。
同じ理由でトランザクションBの在庫引当APも待ちが発生するから、こうしてデッドロックになるわけです。
2021.09.05 22:10
関数従属さん
★DB ブロンズマイスター
(No.4)
>同一トランザクション内で同一資源に対して共有ロック⇒専有ロックの順序でロックをかけることは可能>なのでしょうか?
可能となります。
>共有ロックに対し専有ロックが不可なのは、トランザクション間のみの話ということでしょうか?
上記の通りとなります。
(別のトランザクションが共有ロック中は自トランザクションの専有ロックは不可)
2021.09.05 22:11
ロックさん
(No.5)
GinSana様
関数従属様
ご回答ありがとうございます。
「共有⇒専有なんて無理だよなあ…。でもこれが可能なのがこの問題の前提になってるよなあ。」とモヤモヤしながら問題を解きましたが、おかげさまでスッキリしました。
ありがとうございました。
関数従属様
ご回答ありがとうございます。
「共有⇒専有なんて無理だよなあ…。でもこれが可能なのがこの問題の前提になってるよなあ。」とモヤモヤしながら問題を解きましたが、おかげさまでスッキリしました。
ありがとうございました。
2021.09.05 22:28
返信投稿用フォーム
スパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。