Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

L'identità SQL (numero automatico) viene incrementata anche con un rollback della transazione

Se ci pensi, il numero di incremento automatico non dovrebbe essere transazionale. Se altre transazioni dovessero attendere per vedere se la numerazione automatica sarebbe stata utilizzata o "riportata indietro", sarebbero state bloccate dalla transazione esistente utilizzando la numerazione automatica. Ad esempio, considera il mio codice psuedo di seguito con la tabella A utilizzando un campo di numerazione automatica per la colonna ID:

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

Se la transazione dell'utente 2 inizia un millisecondo dopo quella dell'utente 1, il loro inserimento nella tabella A dovrebbe attendere il completamento dell'intera transazione dell'utente 1 solo per vedere se è stato utilizzato il numero automatico dal primo inserimento in A.

Questa è una funzionalità, non un bug. Consiglierei di utilizzare un altro schema per generare numeri automatici se hai bisogno che siano strettamente sequenziali.