MySQL: オートインクリメントはロールバックされない
データベースにデータを一括登録する処理を実装していた時に、 idの値が何故かめちゃくちゃ増えるという現象に遭遇した。
idの値が実態のレコード件数と大幅に食い違う
テーブル作成直後でオートインクリメントの値が1の状態で、データの登録自体は100件なのに、一括登録処理の後にidの最大値を見てみると200となっていた。ちなみに、idは未指定なのでオートインクリメントの値が適用されるはず。
プログラムで変なバグを作り込んでしまったのかと思ってソースの調査をしてみたけれど、怪しいところはみつからず。
自分の行っていた作業を振り返ってみる
改めて、一括登録のテストを行っていた時に行った事を振り返ってみる。
- 一括登録処理を実行
- エラーで処理がDBの内容がロールバックされる
- 一括登録処理を再実行
- データベースを確認して本現象に気づく
前段で気になった事をキーワードにGoogleで検索してみた
ロールバックした時が怪しい事に気づき、Googleで「MySQL オートインクリメント ロールバック」とかそんな感じのキーワードで検索してみると、「auto_incrementは戻らない」という内容のブログが多数ヒットした。
オートインクリメントの値がロールバックされないのは仕様です
オートインクリメントの値をロールバックしてしまうと、idを取得するだけでもテーブルロックしてしまうから、と言う事でオートインクリメントはロールバックされないということらしい。まぁ言われてみればそうかもしれない・・・と今更気づいた。
まとめ
今回のケースはバグではなく、DBの仕様だったのでホッとしましたが、 こういった基礎的な事は普段から学ぶ必要があるなぁと痛感した出来事でした。