【MySQL】ギャップロックについて
2021.10.31
みなさん、こんにちは
エンジニアの高橋です。
本日はMySQLのギャップロックについてお話したいと思います。
下記のようなテーブルがあるとします。
table name: test
primary key: id
id, string
1, aaa
2, bbb
3, ccc
4, ddd
10, eee
20, fff
ここに select * from table-a where id = 2 for updateを実行するとid: 2のレコードが取得でき、ロックが取られるのはid: 2のレコードのみなので、そのほかのレコードは更新は問題なく行えます。
では、select * from table-a where 4 <= id and id <= 10 for updateだとどうでしょうか??
取得できるレコードはid: 4のレコードとid: 10のレコードです。ただし、ロックが取られるレコードは空振りが発生している5〜9までの部分もロックが取られてしまい、新たに5〜9のレコードをinsertしようとしてもロックまちが発生してしまいます。
存在しないレコードに対してロックが取られることが「ギャップロック」と言います。
皆さんもfor updateをかける際はレコードの空振りに気をつけていきましょう。
--------------------------------------------------
社員を募集しております!
type
開発エンジニア*前職給与保証*リモート可*ブランクOK*案件還元率80%以上*月給35万円~*年休128日
社員のゲーム実況チャンネル
$fugaのゲーム実況
社員を募集しております!
type
開発エンジニア*前職給与保証*リモート可*ブランクOK*案件還元率80%以上*月給35万円~*年休128日
社員のゲーム実況チャンネル
$fugaのゲーム実況