sql >> データベース >  >> RDS >> Oracle

SELECT ...FORUPDATEの動作を理解するのに助けが必要ですデッドロックを引き起こします

    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';
    


    1. SQLAlchemy count()が生のクエリよりもはるかに遅いのはなぜですか?

    2. MySQLデータファイルは縮小しません

    3. Windowsでのmysql5.5用のRubyGem

    4. スプレッドシートとデータベース:切り替える時が来ましたか?パート1