MariaDBでAUTO_INCREMENTの値が戻る罠

GMOアドマーケティングのT.Kです。
MariaDBでAUTO_INCREMENTの値が戻る現象に遭遇したので、紹介したいと思います。
発生条件はパーティションを使っているテーブルに対して、並列トランザクションでINSERTを行い、片方のトランザクションで払い出したAUTO_INCREMENTの値を使わなかった場合です。

  • 検証環境
    OS: CentOS 7
    DB: MariaDB 10.4.13
    各種設定はデフォルト値
  • 再現手順
    • テーブル
    • transaction1
    • transaction2
      ロック待ちにするために、transaction1と同じUNIQUE KEYを使用します。
    • transaction1
    • transaction2
  • 状態の確認
    ここまでは想定通りの動作のように見えます。
    しかし、改めてAUTO_INCREMENTを確認すると「2」に戻っています。

    追加でデータをINSERTすると、しっかり「2」が使われています。

    AUTO_INCREMENTは「3」に増えて、更に同じ日のデータをINSERTしようとするとDuplicate entryエラーが発生します
  • 対策
    • 案1
      AUTO_INCREMENTの代わりにSEQUENCEを使う
    • 案2
      MariaDB 10.2以下を使う(10.3も値が戻る)
  • まとめ
    実際のシステムでは ON DUPLICATE KEY UPDATE を使っていたため、
    エラーは発生せず、データの不整合が起きて、調査に時間がかかりました。
    動作検証の段階で問題に気づけたのは良かったです。
    互換性があるという思い込みが危険だということを改めて認識しました。