Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Identität (automatische Nummerierung) wird auch bei einem Transaktions-Rollback erhöht

Wenn Sie darüber nachdenken, sollte die Auto-Increment-Nummer nicht sein transaktional sein. Wenn andere Transaktionen warten müssten, um zu sehen, ob die automatische Nummer verwendet oder "zurückgesetzt" wird, würden sie durch die vorhandene Transaktion blockiert, die die automatische Nummer verwendet. Betrachten Sie zum Beispiel meinen Pseudocode unten mit Tabelle A, die ein Feld mit automatischer Nummerierung für die ID-Spalte verwendet:

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

Wenn die Transaktion von Benutzer 2 eine Millisekunde nach der von Benutzer 1 beginnt, müsste ihre Einfügung in Tabelle A warten, bis die gesamte Transaktion von Benutzer 1 abgeschlossen ist, nur um zu sehen, ob die automatische Nummer von der ersten Einfügung in A verwendet wurde.

Dies ist ein Feature, kein Fehler. Ich würde empfehlen, ein anderes Schema zu verwenden, um automatische Nummern zu generieren, wenn Sie eine enge Sequenz benötigen.