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

SQL-identitet (autonummerering) øges selv med en tilbagerulning af transaktioner

Hvis du tænker over det, bør den automatiske stigning ikke være transaktionsmæssig. Hvis andre transaktioner skulle vente for at se, om autonummeret skulle bruges eller "rulles tilbage", ville de blive blokeret af den eksisterende transaktion med autonummeret. Overvej f.eks. min psuedo-kode nedenfor med tabel A ved at bruge et autonummerfelt til ID-kolonnen:

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

Hvis bruger 2's transaktion starter et millisekund efter bruger 1's, så skal deres indsættelse i tabel A vente på, at bruger 1's hele transaktion er fuldført bare for at se, om autonummeret fra den første indsættelse i A blev brugt.

Dette er en funktion, ikke en fejl. Jeg vil anbefale at bruge et andet skema til at generere automatiske numre, hvis du har brug for dem til at være tæt sekventielle.



  1. MySQL, opdater flere tabeller med en forespørgsel

  2. MySQL Left Joins:Vælg alt fra én tabel, men kun matchende værdi i anden tabel med kriterier

  3. Kan ikke oprette tabel med forberedt erklæring

  4. Tilføjelse af en identitet til en eksisterende kolonne