Web ベースのアプリケーションがあります。アプリケーションには時間制限のあるデータベース操作 (INSERT および UPDATE) があり、完了するまでにより多くの時間がかかります。そのため、この特定のフローは Java スレッドに変更され、完全なデータベース操作が完了するまで待機 (ブロック) しません。
私の問題は、複数のユーザーがこの特定のフローに遭遇した場合、PostgreSQL によってスローされる次のエラーに直面していることです。
org.postgresql.util.PSQLException: ERROR: deadlock detected
Detail: Process 13560 waits for ShareLock on transaction 3147316424; blocked by process 13566.
Process 13566 waits for ShareLock on transaction 3147316408; blocked by process 13560.
上記のエラーは、INSERT ステートメントで一貫してスローされます。
追加情報: 1) このテーブルに PRIMARY KEY が定義されています。2) この表には FOREIGN KEY 参照があります。3) 個別のデータベース接続が各 Java スレッドに渡されます。
テクノロジー Web サーバー: Tomcat v6.0.10 Java v1.6.0 サーブレット データベース: PostgreSQL v8.2.3 接続管理: pgpool II