1

たまにmysqlエラーが発生します。エラーは

Deadlock found when trying to get lock; try restarting transaction

クエリは

var res = cn.Execute("insert ignore into 
    Post(desc, item_id, user, flags)
    select @desc, @itemid, @userid, 0", 
    new { desc, itemid, userid });

このクエリは一体どうやってそれを引き起こすことができますか?グーグルするとき、長いロック行を取り、この問題を引き起こすクエリがどのように発生するかについて何かを見ましたが、この挿入のために行に触れる必要はありません

4

1 に答える 1

5

デッドロックは、トランザクション間の順序付けとロックの取得によって発生します。通常、接続ごとに1つのアクティブなトランザクションがあります(ただし、データベースが異なれば動作も異なる場合があります)。したがって、デッドロックが発生する可能性があるのは、複数の接続、つまり複数の重複するトランザクションの場合のみです。単一の接続/トランザクションは、取得できないロックがないため、それ自体をデッドロックすることはできません。つまり、ロックを持っているか、取得することができます。

挿入デッドロックは、一意の制約によって引き起こされる可能性があります。そのため、原因として一意のキーの制約を確認してください。その他の原因としては、「更新用」ステートメントの選択などでロックが保持されている可能性があります。

また、すべてのトランザクションが、それらを必要とする操作の直後に完了する(コミットまたはロールバックされる)ことを確認してください。トランザクションがタイムリーに閉じられない場合、そのようなデッドロック動作につながる可能性があります。「autocommit」は通常これを処理しますが、変更することができ、信頼するべきではありません。適切な手動トランザクションの使用をお勧めします。

詳細については、必要なMysqlデッドロックの説明とデッドロックに対処する方法を参照してください。この場合、「再試行する」だけで十分である可能性があります。

于 2013-02-16T19:52:39.967 に答える