USERテーブルには、おそらくそれを参照する多くの外部キーがあります。それらのいずれかがインデックス付けされていない場合、Oracleは親テーブルから行を削除する間、子テーブル全体をロックします。複数のステートメントが同時に実行されると、たとえ異なるユーザーであっても、同じ子テーブルがロックされます。これらの再帰操作の順序は制御できないため、複数のセッションが同じリソースを異なる順序でロックし、デッドロックを引き起こす可能性があります。
このセクション を参照してください。 詳細については、コンセプトマニュアルを参照してください。
これを解決するには、インデックス付けされていない外部キーにインデックスを追加します。列名が標準の場合、次のようなスクリプトは潜在的な候補を見つけるのに役立ちます。
--Find un-indexed foreign keys.
--
--Foreign keys.
select owner, table_name
from dba_constraints
where r_constraint_name = 'USER_ID_PK'
and r_owner = 'THE_SCHEMA_NAME'
minus
--Tables with an index on the relevant column.
select table_owner, table_name
from dba_ind_columns
where column_name = 'USER_ID';