1

私はこの問題を抱えており、まだ解決策を見つけていません:

複数のテーブルを持つアプリケーションがあります (ほとんどのアプリケーションと同様)。

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 を使用しています。

4

1 に答える 1