2

以下があるとします

Begin Tran

Insert Into tbl(name) values('name1');

Insert Into tbl(name) values('name2');


Rollback

End

テーブルtblには ID 列 (id) と varchar 列 (name) があります。

明らかに、データはロールバックされます。

もう一度レコードを挿入しようとすると、Id 列の値は 1 ではなく 3 です。

なんで?ID 列の値がトランザクションに参加しないのはなぜですか? どこに保管されていますか?等

私はこれとこれを読みまし、それでももっと深い情報が必要です。

前もって感謝します

4

2 に答える 2

3
T1:                      |  T2
begin                    |  begin     
insert <-- gets ID 1     |
                         |    insert <-- gets ID 2
rollback                 |

ID生成が「トランザクションに参加する」場合、T1がロールバックした後に次のIDがどのような値になるかを答えることができる場合にのみ...

于 2013-04-03T10:22:22.180 に答える
1

MSDN自体を確認できます。

... 「値の再利用 – 特定のシード/増分を持つ特定の ID プロパティの場合、ID 値はエンジンによって再利用されません。特定の挿入ステートメントが失敗した場合、または挿入ステートメントがロールバックされた場合、消費された ID 値は失われます。再度生成されることはありません。これにより、後続の ID 値が生成されるときにギャップが生じる可能性があります。」

「これらの制限は、パフォーマンスを向上させるための設計の一部であり、多くの一般的な状況で許容されるためです。これらの制限のために ID 値を使用できない場合は、現在の値を保持する別のテーブルを作成し、テーブルへのアクセスを管理してください。あなたのアプリケーションで番号の割り当てをしてください。」

そして、単純な理由は、次のように生成されるため、その列のシードが設定されていないためだと思います。

新しい値はそれぞれ、現在のシードとインクリメントに基づいて生成されます

値を変更するseedと、同時挿入でさらに混乱が生じる可能性があり、UNIQUEorと共存するとPRIMARY KEY、特にトランザクションの多い環境では、挿入がより簡単に「死ぬ」可能性があります。

于 2013-04-03T10:23:21.973 に答える