平成31 午後1 問3 設問4 (3)
素人さん
(No.1)
AXのP4,P2
AYのP2,P4
もデッドロックが起こると考えております。
例えば、
①AXのP4をロック
②AZのP2をロック
③AZのP4のロック待ち(①でロックされてるので)
④AXのP2のロック待ち(②でロックされてるので)
処理の順番てきにこれも起こり得ると考えておりますが、回答としては不適切なのでしょうか?
お手数ですが、ご教示お願いします。
AYのP2,P4
もデッドロックが起こると考えております。
例えば、
①AXのP4をロック
②AZのP2をロック
③AZのP4のロック待ち(①でロックされてるので)
④AXのP2のロック待ち(②でロックされてるので)
処理の順番てきにこれも起こり得ると考えておりますが、回答としては不適切なのでしょうか?
お手数ですが、ご教示お願いします。
2020.10.11 19:06
同感さん
(No.2)
うまく説明はできないのですが、どの処理順で並列実行しても、「P2とP4の組」でデッドロックが発生するより先に、「P4とP9の組」でデッドロックが発生するようですので、「P2とP4の組」では正答にはならないのだと思います。
※私も疑問に思っていたので、AXとAZの処理の並列実行した時、それぞれのトランザクションが在庫テーブルのどの行をロックしているのか、書き起こして確認してみました。(エディタにコピペしていただくと多少見やすくなるかもです)
かえって混乱させてしまうかもですが、ご参考まで。。
◆図3:デッドロックのケース1
処理1 処理2 在庫テーブルの品番(P1-9)行とそれをロックしている処理
[AX] [AZ] P1 P2 P3 P4 P5 P6 P7 P8 P9
P1 -- -- -- -- -- -- -- -- -- --
P4 -- -- -- -- -- -- -- -- -- --
P9 -- -- -- -- -- -- -- -- -- --
UPDATE -- AX -- -- AX -- -- -- -- AX 手順② AXが更新行をロック(P1,P4,P9)
-- P3 AX -- -- AX -- -- -- -- AX
-- P7 AX -- -- AX -- -- -- -- AX
-- P9 AX -- -- AX -- -- -- -- AX
-- UPDATE AX -- AZ AX -- -- AZ -- !! 手順② AZが更新行をロック(P3,P7,P9)←P9はAXのロック開放待ち
P2 -- AX -- AZ AX -- -- AZ -- AX
P9 -- AX -- AZ AX -- -- AZ -- AX
UPDATE -- AX AX AZ AX -- -- AZ -- AX 手順⑤ AXが更新行をロック(P2,P9)
P3 -- AX AX AZ AX -- -- AZ -- AX
UPDATE -- AX AX !! AX -- -- AZ -- AX 手順⑤ AXが更新行をロック(P3)←P3はAZのロック開放待ち
↓
デッドロック発生
◆図4:デッドロックのケース2
処理1 処理2 在庫テーブルの品番(P1-9)行とそれをロックしている処理
[AX] [AZ] P1 P2 P3 P4 P5 P6 P7 P8 P9
P1 -- -- -- -- -- -- -- -- -- --
P4 -- -- -- -- -- -- -- -- -- --
-- P3 -- -- -- -- -- -- -- -- --
-- P7 -- -- -- -- -- -- -- -- --
-- P9 -- -- -- -- -- -- -- -- --
-- UPDATE -- -- AZ -- -- -- AZ -- AZ 手順② AZが更新行をロック(P3,P7,P9)
-- P2 -- -- AZ -- -- -- AZ -- AZ
P9 -- -- -- AZ -- -- -- AZ -- AZ
UPDATE -- AX -- AZ AX -- -- -- -- !! 手順② AXが更新行をロック(P1,P4,P9)←P9はAZのロック開放待ち
-- P4 AX AZ AZ !! -- -- -- -- -- 手順⑤ AZが更新行をロック(P2,P4)←P4はAXのロック開放待ち
↓
デッドロック発生
※私も疑問に思っていたので、AXとAZの処理の並列実行した時、それぞれのトランザクションが在庫テーブルのどの行をロックしているのか、書き起こして確認してみました。(エディタにコピペしていただくと多少見やすくなるかもです)
かえって混乱させてしまうかもですが、ご参考まで。。
◆図3:デッドロックのケース1
処理1 処理2 在庫テーブルの品番(P1-9)行とそれをロックしている処理
[AX] [AZ] P1 P2 P3 P4 P5 P6 P7 P8 P9
P1 -- -- -- -- -- -- -- -- -- --
P4 -- -- -- -- -- -- -- -- -- --
P9 -- -- -- -- -- -- -- -- -- --
UPDATE -- AX -- -- AX -- -- -- -- AX 手順② AXが更新行をロック(P1,P4,P9)
-- P3 AX -- -- AX -- -- -- -- AX
-- P7 AX -- -- AX -- -- -- -- AX
-- P9 AX -- -- AX -- -- -- -- AX
-- UPDATE AX -- AZ AX -- -- AZ -- !! 手順② AZが更新行をロック(P3,P7,P9)←P9はAXのロック開放待ち
P2 -- AX -- AZ AX -- -- AZ -- AX
P9 -- AX -- AZ AX -- -- AZ -- AX
UPDATE -- AX AX AZ AX -- -- AZ -- AX 手順⑤ AXが更新行をロック(P2,P9)
P3 -- AX AX AZ AX -- -- AZ -- AX
UPDATE -- AX AX !! AX -- -- AZ -- AX 手順⑤ AXが更新行をロック(P3)←P3はAZのロック開放待ち
↓
デッドロック発生
◆図4:デッドロックのケース2
処理1 処理2 在庫テーブルの品番(P1-9)行とそれをロックしている処理
[AX] [AZ] P1 P2 P3 P4 P5 P6 P7 P8 P9
P1 -- -- -- -- -- -- -- -- -- --
P4 -- -- -- -- -- -- -- -- -- --
-- P3 -- -- -- -- -- -- -- -- --
-- P7 -- -- -- -- -- -- -- -- --
-- P9 -- -- -- -- -- -- -- -- --
-- UPDATE -- -- AZ -- -- -- AZ -- AZ 手順② AZが更新行をロック(P3,P7,P9)
-- P2 -- -- AZ -- -- -- AZ -- AZ
P9 -- -- -- AZ -- -- -- AZ -- AZ
UPDATE -- AX -- AZ AX -- -- -- -- !! 手順② AXが更新行をロック(P1,P4,P9)←P9はAZのロック開放待ち
-- P4 AX AZ AZ !! -- -- -- -- -- 手順⑤ AZが更新行をロック(P2,P4)←P4はAXのロック開放待ち
↓
デッドロック発生
2020.10.12 23:19
素人さん
(No.3)
丁寧にご回答くださりありがとうございます!
とても分かりやすい図でした!
確かに、先にp4p2で、デッドロックが起きるので、当方の考えでは不適切でしたね。
すっきりしました。
ありがとうございます。
とても分かりやすい図でした!
確かに、先にp4p2で、デッドロックが起きるので、当方の考えでは不適切でしたね。
すっきりしました。
ありがとうございます。
2020.10.18 10:10
返信投稿用フォーム
スパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。