タイトルのような実装があって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を実行しようとするとお互いがロックを獲得しているので 片方は成功し、片方はデッドロックで死ぬ!
終わり!