ホームページ > データベース > mysql チュートリアル > MySQL の AUTO_INCREMENT がロールバック後にリセットされないのはなぜですか?

MySQL の AUTO_INCREMENT がロールバック後にリセットされないのはなぜですか?

Patricia Arquette
リリース: 2024-12-22 16:31:10
オリジナル
136 人が閲覧しました

Why Doesn't MySQL's AUTO_INCREMENT Reset After a Rollback?

MySQL AUTO_INCREMENT がロールバックの影響を受けない理由

MySQL の AUTO_INCREMENT フィールドは、トランザクションのステータスに関係なく一意の値を維持します。この動作は、次のシナリオに由来します:

シナリオ:

  1. プログラム 1 がテーブル FOO にレコードを挿入し、自動インクリメントされるプライマリの値 557 を生成します。 key.
  2. プログラム 2 はテーブル FOO にレコードを挿入し、値を取得します。 558.
  3. プログラム 2 は、558 値をテーブル BAR に外部キーとして挿入します。
  4. プログラム 2 はコミットします。
  5. プログラム 1 はロールします。

問題:

ロールバック後に 557 値を再利用すると、いくつかの未解決の問題が発生します:

  • 主キー値の減少FOO では、より高い値を持つ他のレコードに影響を与えます。
  • 変更BAR では外部キーを削除する必要があり、他のデータに影響を与える可能性があります。
  • プログラム 3 から印刷されたレポートを消去することは事実上不可能です。

結果:

このため、Oracle のシーケンス番号も独立して動作します。 transactions.

回避策:

ギャップのない自動インクリメント値を維持することが重要な場合、トランザクション ロールバックは使用できません。代わりに、ステータス フラグをレコードに追加できます。

  • 最初の挿入時に、ステータスを「未完了」に設定します。
  • トランザクション中、次の場合にステータスを「完了」に更新します。操作は成功しました。
  • トランザクションをコミットして、レコードをライブとしてマークします。
  • トランザクションがロールバックすると、不完全なレコードが失われます。

このソリューションには独自の課題がありますが、自動増分ギャップを回避しながら監査証跡を保持する方法を提供します。

以上がMySQL の AUTO_INCREMENT がロールバック後にリセットされないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート