ぱいぱいにっき

Pythonが好きすぎるけれど、今からPerlを好きになりますにっき

MySQL(InnoDB)でFOR UPDATEと楽観ロックを組み合わせるとどうなるっていう件について

はい、どうもマコピーです。

この前、社内勉強会で @MySQL(InnoDB)のロックについての話があったのですが、そこで思いついたこんな感じのこと。



みたいなことを思って、質問して、その場でやってもらったわけでございます。

で、だいたいこんな感じ。

http://ascii.io/a/5144

正解としては僕の予想は間違っていて、ちゃんと楽観ロックとして機能するという感じです。

その場での挙動の推察は、

  1. TXN Aで行ロックを獲得
  2. TXN BでUPDATE。pkのid = 1が指定されているのでブロック
  3. TXN Aでカウントアップ
  4. TXN Aがコミットされる
  5. TXN Bでブロックが解除、ここでvalue = 100の絞り込みが走るものの既に行は変更されているのでアップデートは1行もかからない

みたいな感じか?となっております。たぶんこの辺りの挙動は @ がソースを読んで詳解していただけると信じております。以上。