1. ホーム
  2. .net

[解決済み] トランザクションをロールバックしてもSQL Identity(autonumber)がインクリメントされる。

2023-07-13 22:26:22

質問

SQL Server 2005 データベースに SQL を挿入する .net トランザクションがあります。テーブルには ID 主キーがあります。

トランザクション内でエラーが発生した場合 Rollback() が呼び出されます。行の挿入は正しくロールバックされますが、次にテーブルにデータを挿入すると、ロールバックが発生しなかったかのように ID がインクリメントされます。つまり、本質的に ID シーケンスにギャップがあるのです。このような場合 Rollback() メソッドで失われた ID を再生させる方法はありますか?

私のアプローチの仕方は間違っているのでしょうか?

どのように解決すればよいのでしょうか?

考えてみれば、自動インクリメントの数値は ではいけないのでしょうか? はトランザクション的であるべきです。 もし他のトランザクションが自動インクリメント番号が使用されるかロールバックされるかを待たなければならないとしたら、それらは自動番号を使用している既存のトランザクションによってブロックされることになります。 たとえば、ID列に自動番号フィールドを使用するテーブルAでの、以下の私の偽のコードを考えてみましょう。

User 1
------------
begin transaction
insert into A ...
insert into B ...
update C ...
insert into D ...
commit


User 2
-----------
begin transaction
insert into A ...
insert into B ...
commit

ユーザー2のトランザクションがユーザー1のトランザクションの1ミリ秒後に開始された場合、テーブルAへの挿入は、Aへの最初の挿入から自動番号が使用されたかどうかを確認するために、ユーザー1のトランザクション全体が完了するまで待機しなければならないでしょう。

これは機能であり、バグではありません。 自動番号を厳密に連続させる必要がある場合は、自動番号を生成するために別のスキームを使用することをお勧めします。