Déclarez une table qui stocke tous les numéros de séquence et utilisez ensuite l'instruction comme celle donnée ci-dessous :
déclarer @SequenceNo int
UPDATE MySequenceNumberTable
SET @SequenceNo = SequenceNo = SequenceNo + 1
WHERE SequenceName = 'Your sequence name'
Ici, une seule instruction incrémente la valeur, l'assigne à une variable et met à jour la table de la base de données, de sorte que son action atomique est garantie. Comme il s'agit d'une simple opération de mise à jour de la base de données, elle joue un rôle dans la transaction de la base de données. Si la transaction est annulée, la valeur du champ SequenceNo est rétablie à sa valeur précédente.
Le seul problème est que la transaction suivante qui demande la valeur suivante pour le même nom de séquence doit attendre que la première transaction soit validée ou annulée à cause du verrouillage au niveau de la ligne. Dans le cas d'une séquence DB, il n'y a pas de verrouillage de la séquence et elle ne bloque donc jamais les autres transactions nécessitant la valeur suivante.
Dans notre cas, nous ne pouvons tout simplement pas avoir de trous et nous avons besoin d'une protection contre la concurrence. Nous utilisons donc la méthode ci-dessus et cela fonctionne bien pour nous.