mysqlで UPDATE
をするときは、トランザクションを作るのが基本だが、
トランザクションを作るということは ロックがかかる
UPDATE する行が1行であれば、その行だけにロックをかける。それだけなら特に問題ないが、テーブル全体にロックがかかる場合がある。これはやばい
どんなときにテーブルロックが発生するか
- INDEX が効かない UPDATE (すべての行を確かめる必要があるから)
テーブルロックを起こさないために
INDEX が効かない UPDATE は機械的に認識して、排除すればいいのでは・・
そもそも、広範囲に対して UPDATE ってどんな状況なのだろうか。すべて WHERE id = ?
で統一できれば、優しい世界になると思うけど。
参考リンク
実際に InnoDB が何をロックしているか、等の見方が以下の記事にすべて書いてあって、とても良い