タグ

2019年4月14日のブックマーク (2件)

  • MySQL(InnoDB)のネクストキーロックの仕組みと範囲を図解する - 備忘録の裏のチラシ

    MySQL(InnoDB) のロックにはレコードロックとかギャップロックとかネクストキーロックとかありますが、結構ややこしくて、クエリで条件文が与えられた時にそれがどのようなロックになるのかをイメージし辛い問題が自分の中でありました。ので、実験してみた(MySQL8.0.12、REPEATABLE READ)結果を図で書き残します。なお、結果は SELECT FOR UPDATE を使って排他ロックをとる方法で試したものですが、ロックの範囲を知る上では、排他ロックか共有ロックかとかは関係ないかと思います。 前提として、以下のような id カラムのみを持つインデックスレコードへのロックを考えます。レコードには10 ~ 40 までの 5 飛びの値が存在します。それぞれのインデックスレコードの間にはギャップ(gap)が存在します。また、最初のレコードの前と最後のレコードの後には、論理的な最小値へ

    MySQL(InnoDB)のネクストキーロックの仕組みと範囲を図解する - 備忘録の裏のチラシ
  • なかったらINSERTしたいし、あるならロック取りたいやん?

    7. ギャップロックされた 空間のINSERTは止まる 5 6 10 id (pk) tx A tx B SELECT * FROM t WHERE id = 4 FOR UPDATE BEGIN BEGIN INSERT INTO t (id) VALUES (1); ブロックされる id=2,3,4も同様にブロック id=7とかはブロックされない 7 8. ギャップロック同士は ブロックしない 5 6 10 id (pk) tx A tx B SELECT * FROM t WHERE id = 4 FOR UPDATE BEGIN BEGIN SELECT * FROM t WHERE id = 3 FOR UPDATE INSERT INTO t (id) VALUES(4) INSERT INTO t (id) VALUES(3) 同じギャップ空間だけど止まらない Deadloc

    なかったらINSERTしたいし、あるならロック取りたいやん?