ロックするときの動作
- スキャンされた行のロックを取得
- 結果セットに含まれない行のロックを解除
ロックが発生したときに確認すること
- インデックスが使用されずに全検索されていないか
- 想定した結合順序で実行されているか
- ギャップロックで想定外のレコードがロックされていないか
対処方法
- インデックスが使用されていなければ追加する
- ヒント句を使用して結合順序や使用するインデックスを固定する
- 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以降のレコードに対してロックがかかる
参考サイト