トランザクション ロールバック後の SQL Server 自動インクリメント列の増分動作: 問題ではありません
.NET トランザクションが、自動インクリメント主キーを使用して SQL Server 2005 データベースにデータを挿入するとします。 Rollback()
メソッドは、トランザクション内でエラーが発生した場合、行挿入操作を正しくロールバックします。ただし、同じテーブルへの後続の挿入では、ロールバックが発生しなかったかのように自動インクリメント列がインクリメントされ、シーケンスにギャップが生じます。
自動インクリメント機能を理解する
自動インクリメント数値の設計は非トランザクションであることを理解することが重要です。この設計の理論的根拠は、他のトランザクションが続行する前に、増分された数値の消費またはロールバックを待機する必要がある場合、ブロックが発生する可能性があるということです。
これを説明するために、ユーザー 1 とユーザー 2 が ID 列として自動インクリメント フィールドを使用してテーブル A と対話する次のシナリオを考えてみましょう。
<code>用户 1 ------------ begin transaction insert into A ... insert into B ... update C ... insert into D ... commit 用户 2 ----------- begin transaction insert into A ... insert into B ... commit</code>
ユーザー 2 のトランザクションがユーザー 1 のトランザクションの後で発生した場合、ほんの少し遅れても、テーブル A への挿入操作は、初めてテーブル A から行われたものであることを確認するために、ユーザー 1 のトランザクション全体が完了するまで待機する必要があります。挿入された自動インクリメント番号が使用されるかどうか。
結論
したがって、トランザクションがロールバックされた後も自動インクリメント列がインクリメントを続ける動作はエラーではなく、意図的に設計された戦略です。正確に連続的に増加する数値が必要な場合は、そのような値を生成するために他のメカニズムを考慮する必要があります。
以上がSQL Server ID (自動インクリメント) はトランザクションのロールバック後もインクリメントされ続けますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。