Coffmanの循環待機条件 その2
2025/11/03
A,B,C,Dあって行ロックするのはこれらの組み合わせ。
ソートすれば15通りの組み合わせだけになります。
一回のロックでの組み合わせが、この中のものであれば、デッドロックしないよーという話。
デッドロックするケースは、あるプロセスでは、A、B。別のプロセスでB、Aとするとデッドロック。
ORA-00060)
が、実験した結果、クエリーを1行ずつfor updateだと、投げると簡単にデッドロックを起こせますが、IN句を使うと、おそらく問題ないです。
どうもoracleの実装が、僕の一億倍ぐらい賢いのかもしれません。ですので、複数行をロックする場合は、INを使ったほうがよいという結論、あと、order byなくても大丈夫っぽい。
だめな、投げ方は
セッション1
SELECT * FROM test_deadlock WHERE id = 'A' FOR UPDATE;
SELECT * FROM test_deadlock WHERE id = 'B' FOR UPDATE;
セッション2
SELECT * FROM test_deadlock WHERE id = 'B' FOR UPDATE;
SELECT * FROM test_deadlock WHERE id = 'A' FOR UPDATE;
OKなのは、たぶん
セッション1
SELECT * FROM test_deadlock WHERE id IN ('A', 'B') FOR UPDATE;
セッション2
SELECT * FROM test_deadlock WHERE id IN ('B', 'A') FOR UPDATE;
一見だめそうだけど、OKぽい、ORDER BY なくても順番を考慮してくれてるのかなーまったくわからないけど。
: