私はこの問題を抱えており、まだ解決策を見つけていません:
複数のテーブルを持つアプリケーションがあります (ほとんどのアプリケーションと同様)。
2 つのテーブルは次のとおりです。
TB_POLICY
---------
id number(18) : PK
... some other columns
TB_REDEMPTION
-------------
id number(18) : PK
fk_policy number(18) : NOT NULL, FK
... some other columns
はTB_POLICY
、そのフィールドの一部のハッシュによって分割され、リレーションのTB_REDEMPTION
参照によって分割されます。fk_policy
テーブルTB_POLICY
には約 50,000 レコードが含まれ、テーブルTB_REDEMPTION
には約 25,000,000 レコードが含まれます。
アプリケーションが1 つのトランザクションで 1 つTB_POLICY
のレコードと多数のレコード (約 200 ~ 300 レコード) を挿入するユース ケースがあります。TB_REDEMPTION
TB_REDEMPTION
コードでブレークポイントをマークすると、(両方のテーブルで) すべての挿入の後、トランザクションをコミットする前に、別のデータベース接続から (SQL*Plus から直接でも)別のレコードを挿入する方法がありません。ただ待って!
多くのことを分析した結果、PK_REDEMPTION
( の主キー インデックスTB_REDEMPTION
) でロックが発生していることがわかりました。
このロックを防ぐにはどうすればよいですか? Web を検索しましたが、挿入中のインデックス ロックに関する情報は見つかりませんでした。
このアプリケーションは Web ベースであり、同じユース ケースを使用する同時ユーザーが多数存在し、ユーザーが主キー インデックスをロックすると、他のユーザーのジョブが妨げられ、アプリケーションのパフォーマンスが非常に低下します。
もう1点、アプリケーションはSpring/Hibernateで開発されているので、トランザクション管理はSpringで行い、DML文はHibernateで作成します。また、Oracle 11g を使用しています。