【MySQL】ギャップロックについて
記事画像
みなさん、こんにちは エンジニアの高橋です。 本日は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をかける際はレコードの空振りに気をつけていきましょう。

--------------------------------------------------
社員を募集しております!

リクナビNEXT
《前職給与保障★年休128日★基本残業なし》プログラマ・SE

社員のゲーム実況チャンネル
$fugaのゲーム実況
この記事を書いた人
投稿者画像
高橋 希望
入社10年目の元不動産営業、現ゲームエンジニア 得意言語はphp,javascript,python,elixirなど
関連する記事