LoginSignup
1
0

MySQLでロックが発生した時に調べたことの備忘録

Last updated at Posted at 2024-02-06

ロックするときの動作

  1. スキャンされた行のロックを取得
  2. 結果セットに含まれない行のロックを解除

ロックが発生したときに確認すること

  • インデックスが使用されずに全検索されていないか
  • 想定した結合順序で実行されているか
  • ギャップロックで想定外のレコードがロックされていないか

対処方法

  • インデックスが使用されていなければ追加する
  • ヒント句を使用して結合順序や使用するインデックスを固定する
  • INNER JOINの変わりにSTRAIGHT_JOINを使用して結合の順序を固定する

MySQLのギャップロックについて

  • インデックスが張られている項目の、存在しない行に対してロックが発生する
1 2 3 4 5 6 7 8
o x x x o x x o
  • 上記レコードの3又は1~5に対してselect for updateをすると、存在しない2~4に対してロックがかかる
  • 上記レコードのに4~6に対してselect for updateをすると、存在しない2~4と6~7に対してロックがかかる
1 2 3 4 5 6 7 8
x x x x o x x x
  • 上記レコードのに4~6に対してselect for updateをすると、存在しない4より前と6以降のレコードに対してロックがかかる

参考サイト

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0