80 votes

SQL Identité (numéroauto) est Incrémenté Même avec une annulation de la Transaction

J'ai un .net de la transaction avec un SQL insert pour un MS SQL 2005 DB. La table a une identité de la clé primaire.

Lorsqu'une erreur se produit au sein de la transaction, Rollback() est appelée. Les insertions de lignes sont restaurées correctement, cependant la prochaine fois je insérer les données dans la table, l'identité est incrémenté comme si la restauration n'a jamais eu lieu. Donc, essentiellement, il y a des lacunes dans l'identité de séquence. Est-il possible d'avoir le Rollback() la méthode de récupérer le manque d'identité?

Je ne suis pas aborder ce la bonne manière?

107voto

Jason Jackson Points 11563

Si vous pensez à ce sujet, l'auto-incrémenter le numéro ne doit pas être transactionnelle. Si d'autres opérations ont eu à attendre pour voir si l'auto-numéro allait être utilisés ou "annulée", ils seraient bloqués par la transaction existante à l'aide de la numérotation automatique. Considérons, par exemple, mon pseudo code ci-dessous avec la table A l'aide d'un auto-champ numéro de la colonne 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

Si l'utilisateur 2 opération commence une milliseconde après de l'utilisateur 1, puis leur insertion dans la table Un aurait à attendre de l'utilisateur 1 intégralité de la transaction complète juste pour voir si l'auto-numéro de la première insertion dans Un a été utilisé.

C'est une fonction, pas un bug. Je vous conseille d'utiliser un autre régime de générer automatiquement des numéros si vous en avez besoin pour être bien séquentielle.

35voto

Mark Brackett Points 46824

Si vous dépendez de votre identité, de valeurs instantanés, alors oui - vous faire de mal. Le point de l'ensemble d'une clé de substitution à l'est de l'avoir aucun sens économique.

Et, non, il n'y a aucun moyen de changer ce behaivor (court de roulement de votre propre auto-incrémentation, et souffrant des conséquences des performances de blocage d'autres inserts).

16voto

Bill Karwin Points 204877

Vous obtenez les lacunes dans votre séquence, si vous DELETE une ligne trop.

Les séquences doivent être uniques, mais ils ne sont pas tenus d'être séquentielle. Le fait qu'ils sont de plus en plus monotone est juste un coup de chance de la mise en œuvre.

6voto

Gavin Miller Points 21752

Autant que je sache, les lignes pour l'insertion réclamer le numéroauto et sur la restauration de ce numéro est perdu pour de bon. Si vous êtes à la fonction de numérotation automatique en cours dans la séquence, vous pourriez envisager de l'approche que vous utilisez.

4voto

BCS Points 18500

Je ne pense pas qu'il n'y a aucune exigence de la numérotation automatique des touches séquentiels. En fait, je ne pense pas qu'ils peuvent être exigés pour être:

  • la transaction a commence et inserts
  • l'opération b commence et inserts
  • la transaction a abandonne

    vous obtenez un trou. rien à faire à ce sujet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X