MySQLのデッドロックとその対処法

デッドロックの原因

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です