3

主キー (IsIdentity=Yes) と一意キー制約を構成する他の 3 つのフィールドを持つ SqlServer 2008 テーブルがあります。

さらに、テーブルにレコードを挿入するストア プロシージャがあり、SqlConnection オブジェクトを使用して C# 経由で sproc を呼び出します。

C# sproc 呼び出しは問題なく動作しますが、C# sproc 呼び出しが Unique Key 制約に違反している場合に興味深い結果が得られることに気付きました....

sproc 呼び出しが Unique Key 制約に違反すると、SqlException がスローされます。これは当然のことであり、クールです。ただし、テーブルに正常に追加された次のレコードの PK 値は、前のレコードより正確に 1 大きくはないことに気付きました。

例: テーブルに、PK 値が 1、2、3、4、および 5 の 5 つのレコードがあるとします。sproc は 6 番目のレコードを挿入しようとしますが、一意キー制約に違反しているため、6 番目のレコードは挿入されません。挿入されます。次に、sproc は別のレコードの挿入を試み、今度は成功します。- この新しいレコードには、6 ではなく 7 の PK 値が与えられます。

これは正常な動作ですか?もしそうなら、その理由を教えていただけますか?(レコードの挿入に失敗した場合、PK インデックスが増加するのはなぜですか?)

これが通常の動作ではない場合、これらの症状が見られる理由について何かヒントをいただけますか?

4

1 に答える 1

6

はい、これは正常です。

ここでトランザクションが行われ、これが SQL Server で実行される操作の潜在的な順序であると想像してください。

  1. ID 1、2、3、4、5 が使用されます。
  2. クライアント A がトランザクションを開始します。
  3. クライアント A は挿入を実行しますが、コミットしません (ID 6)。
  4. クライアント B がトランザクションを開始します。
  5. クライアント B は挿入を実行しますが、コミットしません。(ID 7)。
  6. クライアント A はロールバックします。
  7. クライアント B がコミットします。

この動作 (必ずしも存在しない) の可能性があるため、挿入が失敗したときに ID 6 がスキップされることがわかります。

于 2010-03-27T18:15:56.933 に答える