問題
DB2(バージョン9.5)では、SQLステートメント
SELECT o.Id FROM Table1 o, Table2 x WHERE [...] FOR UPDATE WITH RR
エラーメッセージが表示されますSQLSTATE=42829
(カーソルで指定されたテーブルは変更できないため、FOR UPDATE句は使用できません)。
追加情報
WITH RR
分離レベルで実行しているため、を指定する必要がありますREAD_COMMITTED
が、同じクエリを実行している別のプロセスがある間、クエリをブロックする必要があります。
これまでの解決策...
代わりに次のようにクエリすると、次のようになります。
SELECT t.Id FROM Table t WHERE t.Id IN (
SELECT o.Id FROM Table1 o, Table2 x WHERE [...]
) FOR UPDATE WITH RR
すべてが正常に動作します。
新しい問題
しかし、複数のプロセスがこのクエリを同時に実行すると、デッドロック例外が発生することがあります。
質問
FOR UPDATE
デッドロックが発生する可能性のある場所を導入せずにクエリを作成する方法はありますか?