1

OS : Solaris
データベース: Informix

2 つのスレッドを持つプロセスがあります。

新しいトランザクションを処理し、DB INSERTS を実行するスレッド 1
既存のトランザクションを処理し、DB DELETES を実行するスレッド 2

問題

スレッド 1 は、テーブルに対して INSERTS (新しいトランザクションの追加) を継続的に実行しています。
スレッド 2 は、主キーに基づいて同じテーブルから DELETES (期限切れのトランザクションを削除する) を継続的に実行しています。

244ページ/テーブルのロックが原因で発生しているInformix エラーが原因で、INSERTS が失敗しています。

おそらく、DELETE は行ロックではなくテーブル ロックを行っており、INSERT の動作を妨げています。

このデッドロックを防ぐ方法はありますか?


編集

別の手がかりを見つけました。244エラーはクエリが原因ですSELECT
両方ともinsertdelete操作を実行するselect前に、頻繁に更新されるテーブルから操作を実行します。

アイソレーションは に設定されていCOMMITTED READます。selectこのテーブルを dbaccess から手動で実行すると、削除が行われているときに同じエラーが発生します。

4

1 に答える 1

1

主キーによって単一の要素を削除するときに、DELETE が完全なテーブル ロックを行っていたとしたら、非常に驚​​かれることでしょう。むしろ、変更された行の数が原因で、トランザクション自体の 1 つ (または両方) の寿命が最終的にテーブル ロックを解除する可能性があります。一般に、各トランザクションで単一行以外のすべての操作を排除し、トランザクション モデルが読み取りコミットされるようにすることで、このような揮発性テーブルでのデッドロックを回避できます。少なくとも私の経験はそうでした。

于 2012-09-24T08:00:40.027 に答える