24
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

メモ: DBでrollbackしてもauto_incrementが戻らない理由

Posted at

背景

Rspecでテストを書いていて、sqliteで通っていたがMySQLにすると通らない
エラーを見てみるとidを指定してDBから値を取って来ている処理で、データがが無いと怒られている
テストとして、auto_increment指定しているidが1に戻っている事を期待しているが、戻っていない
しっかりとそこを考えた事がなかったが、ググってみると以下の内容がしっくり来たのでメモとして残す

もしシーケンスがロールバックされうるとしたら、シーケンスを使ってINSERTしているトランザクションが実行中だった場合、それが終了するまではシーケンスが次に何の数字を吐き出すか確定できません。すると、他のトランザクションが単に連番を生成するためだけにブロックされてしまうのです。
RDBの世界で主キーに期待されていることはユニークなことだけであり、連続であることは期待されていません(どうせDELETEで抜け番が発生しますから)。期待されてもいない連続性のためにブロックが発生するのはあり得ないというのがRDB製品共通の解釈だというわけです。
http://cs.hatenablog.jp/entry/2014/03/14/103358

あとがき

こうやって理解しやすい文章にしてもらって、読んでみるとそりゃそうだと腹落ちした
auto_incrementな値は勝手に連番になっている、という思い込みは非常に恐ろしい
なので、思い込みはなるべく捨てたい

24
10
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?