デッドロックの原因
LOCK TABLE(これは普段使わない方がいい)、トランザクションを並列処理することで、互いの処理で必要なテーブルをロックしあって、お互いロック解放待ちになってしまうこと。
理論的には、トランザクションの処理単位が大きいと発生しやすい。
MySQLでのデッドロック検出とロールバック
InnoDBをオートコミット0で使っていれば、勝手にMySQL側で、ロックしているトランザクションを検知して、ロールバックしてくれるので、そこまで気をつかう必要はない。
とはいえオーバーヘッドは発生するので、頻繁にデッドロック警告が出るようならば、発生頻度を減らすように対処は必要。
ただ、オートコミットが1の場合は、上記の機能が効かないので要注意。
https://dev.mysql.com/doc/refman/5.6/ja/innodb-deadlock-detection.html
MySQLでのデッドロックの対処方法
- インデックスを追加することで、スキャンするレコード数を減らし、ロックの可能性を減らす。
- トランザクションの大きさを小さくする
などがある。
https://dev.mysql.com/doc/refman/5.6/ja/innodb-deadlocks.html