【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をかける際はレコードの空振りに気をつけていきましょう。

この記事を書いた人

高橋 希望

入社10年目の元不動産営業、現ゲームエンジニア 得意言語はphp,javascript,python,elixirなど