REPEATABLE READ  共有・専有ロック

ロックさん  
(No.1)
平成29年午後1問2を解いていて疑問に思いましたので質問致します。

この問題の設問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
関数従属さん 
(No.4)
>同一トランザクション内で同一資源に対して共有ロック⇒専有ロックの順序でロックをかけることは可能>なのでしょうか?

可能となります。

>共有ロックに対し専有ロックが不可なのは、トランザクション間のみの話ということでしょうか?

上記の通りとなります。
(別のトランザクションが共有ロック中は自トランザクションの専有ロックは不可)
2021.09.05 22:11
ロックさん  
(No.5)
GinSana様
関数従属様

ご回答ありがとうございます。

「共有⇒専有なんて無理だよなあ…。でもこれが可能なのがこの問題の前提になってるよなあ。」とモヤモヤしながら問題を解きましたが、おかげさまでスッキリしました。

ありがとうございました。
2021.09.05 22:28

返信投稿用フォーム

※宣伝や迷惑行為を防止するため当サイトとIPAサイト以外のURLを含む記事の投稿は禁止されています。

投稿記事削除用フォーム

投稿番号:
パスワード:

その他のスレッド


Pagetop