maco's life

最近は技術以外のことを主に記載しています。

空の行に対してUPDATEをかけてDeadlock

タイトルのような実装があってDeadlockしたのでメモ

例えばテーブルAがあったとして

mysql > BEGIN;
mysql > UPDATE A SET hoge=1 where id = 1

を実行したとする。 この時、id=1 でヒットする対象がない場合、空の行に対してロックを獲得します この時それ以降のINSERTは弾くようになります。

ここで他のトランザクション

mysql > BEGIN;
mysql > UPDATE A SET hoge=1 where id = 1

を実行すると、ここで待たされること無く、ロックを獲得できます。 ここでお互いがロックを獲得しているので、この後それぞれのトランザクションで INSERTを実行しようとするとお互いがロックを獲得しているので 片方は成功し、片方はデッドロックで死ぬ!

終わり!