トランザクションのロールバック中の 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 サイトの他の関連記事を参照してください。