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

mysqlでデッドロックを回避する方法

    私の理解では、選択はロックを取得せず、デッドロックの原因になるべきではありません。

    行を挿入/更新/削除するたびに、ロックが取得されます。デッドロックを回避するには、同時トランザクションがデッドロックを引き起こす可能性のある順序で行を更新しないようにする必要があります。一般的に、デッドロックを回避するには、常に同じ順序でロックを取得する必要があります 異なるトランザクションでも(たとえば、常に最初にテーブルA、次にテーブルB)

    ただし、1つのトランザクション内で1つのテーブルにのみ挿入すると、この条件が満たされ、通常、デッドロックが発生することはありません。トランザクションで何か他のことをしていますか?

    ただし、不足しているインデックスがある場合、デッドロックが発生する可能性があります 。挿入/更新/削除の行の場合、データベースはリレーショナル制約をチェックする必要があります。つまり、リレーションが一貫していることを確認する必要があります。そのためには、データベースは関連するテーブルの外部キーをチェックする必要があります。 かもしれない その結果、変更された行以外のロックが取得されます。その場合は、常に外部キー(およびもちろん主キー)にインデックスを付けるようにしてください。そうしないと、テーブルロックが発生する可能性があります。 行ロックの代わりに 。テーブルロックが発生すると、ロックの競合が発生し、デッドロックが発生する可能性が高くなります。

    あなたのケースで正確に何が起こるかはわかりませんが、おそらくそれは役立つでしょう。



    1. いつテーブル値関数を使用しますか?

    2. MySQLおよびMariaDBデータベースのクラウドバックアップオプション

    3. PostgreSQLでテーブルの行数をすばやく検出する方法

    4. SQL Serverで「datetimeoffset」を「time」に変換します(T-SQLの例)