背景
Rspecでテストを書いていて、sqliteで通っていたがMySQLにすると通らない
エラーを見てみるとidを指定してDBから値を取って来ている処理で、データがが無いと怒られている
テストとして、auto_increment指定しているidが1に戻っている事を期待しているが、戻っていない
しっかりとそこを考えた事がなかったが、ググってみると以下の内容がしっくり来たのでメモとして残す
もしシーケンスがロールバックされうるとしたら、シーケンスを使ってINSERTしているトランザクションが実行中だった場合、それが終了するまではシーケンスが次に何の数字を吐き出すか確定できません。すると、他のトランザクションが単に連番を生成するためだけにブロックされてしまうのです。
RDBの世界で主キーに期待されていることはユニークなことだけであり、連続であることは期待されていません(どうせDELETEで抜け番が発生しますから)。期待されてもいない連続性のためにブロックが発生するのはあり得ないというのがRDB製品共通の解釈だというわけです。
http://cs.hatenablog.jp/entry/2014/03/14/103358
あとがき
こうやって理解しやすい文章にしてもらって、読んでみるとそりゃそうだと腹落ちした
auto_incrementな値は勝手に連番になっている、という思い込みは非常に恐ろしい
なので、思い込みはなるべく捨てたい