はい、どうもマコピーです。
この前、社内勉強会で @ichirin2501 のMySQL(InnoDB)のロックについての話があったのですが、そこで思いついたこんな感じのこと。
これ楽観ロックでUPDATEかけた場合どうなるんだろう #techkayac
— マコピー (@mackee_w) 2013, 8月 23
TXN AがFOR UPDATEでロックかけて、その間にTXN Bが楽観ロックでアップデート、ここでブロックするだろうけれど、これでTXN Aでカウントアップした場合にTXN BのUPDATEはかかるのかどうか #techkayac
— マコピー (@mackee_w) 2013, 8月 23
楽観ロックの件、予想だとpkでロックするからアップデートはされるに一票 #techkayac
— マコピー (@mackee_w) 2013, 8月 23
みたいなことを思って、質問して、その場でやってもらったわけでございます。
で、だいたいこんな感じ。
正解としては僕の予想は間違っていて、ちゃんと楽観ロックとして機能するという感じです。
その場での挙動の推察は、
- TXN Aで行ロックを獲得
- TXN BでUPDATE。pkのid = 1が指定されているのでブロック
- TXN Aでカウントアップ
- TXN Aがコミットされる
- TXN Bでブロックが解除、ここでvalue = 100の絞り込みが走るものの既に行は変更されているのでアップデートは1行もかからない
みたいな感じか?となっております。たぶんこの辺りの挙動は @ichirin2501 がソースを読んで詳解していただけると信じております。以上。