ホームページ > データベース > mysql チュートリアル > SQL トランザクションのロールバック後も自動インクリメント ID が増加するのはなぜですか?

SQL トランザクションのロールバック後も自動インクリメント ID が増加するのはなぜですか?

DDD
リリース: 2025-01-13 22:54:44
オリジナル
378 人が閲覧しました

Why Do Auto-Increment IDs Still Increase After a SQL Transaction Rollback?

トランザクションのロールバック中の SQL 自動インクリメント動作

トランザクション内で SQL テーブルにデータを挿入する場合、主キーの自動インクリメントに関する一般的な問題が発生します。 エラーによりトランザクションがロールバックした場合でも、自動インクリメント カウンタは進みます。

問題:

この不一致により、主キーのシーケンスにギャップが生じる可能性があり、データの整合性と連続した ID を維持することが困難になります。 問題は、Rollback() メソッドで未使用の自動インクリメント値を回復できるかどうかです。

説明:

答えはノーです。 自動インクリメント メカニズムはトランザクションとは独立して動作します。この設計により、前のトランザクションが終了して自動インクリメント値が解放されるのを待っている間に後続のトランザクションが遅延するブロッキングが防止されます。

次の単純化された例を考えてみましょう:

<code>User 1:
- Begins transaction
- Inserts into Table A
- Inserts into Table B
- Updates Table C
- Inserts into Table D
- Commits

User 2:
- Begins transaction
- Inserts into Table A
- Inserts into Table B
- Commits</code>
ログイン後にコピー

ユーザー 2 がユーザー 1 の直後にトランザクションを開始した場合、テーブル A への挿入は、次に使用可能な自動インクリメント値を決定する前に、ユーザー 1 のトランザクション全体が完了するまで待つ必要があります。

なぜこのデザインなのか?

この非トランザクション動作は意図的なものです。潜在的なトランザクションのブロックを回避することで、システムの効率が向上します。 トランザクションが正常に完了したときに自動インクリメント値を割り当てるだけでは、同時挿入が大幅に妨げられ、パフォーマンスに悪影響を及ぼします。

推奨されるアプローチ:

厳密に順次に自動インクリメントされる主キーを必要とするアプリケーションの場合は、代替の一意識別子の生成方法を検討してください。

以上がSQL トランザクションのロールバック後も自動インクリメント ID が増加するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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