J'ai besoin de créer une procédure stockée qui émule une séquence TSQL. Autrement dit, il donne toujours une valeur entière distincte croissante à chaque appel. De plus, si un entier est passé, il devrait retourner cette valeur s'il n'y a jamais eu de résultat supérieur ou le prochain entier le plus élevé disponible. Il va sans dire qu'il peut y avoir plusieurs clients appelant ce SP en même temps.
Étant donné une table MetaInfo avec les colonnes MetaKey varchar (max) et MeatValueLong bigInt. Il est prévu que la ligne avec la méta-clé «Internal-ID-Last» contienne la dernière valeur la plus élevée attribuée. J'ai créé la procédure stockée suivante:
CREATE PROCEDURE [dbo].[uspGetNextID]
(
@inID bigInt
)
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRANSACTION
UPDATE MetaInfo WITH (ROWLOCK)
SET MetaValueLong = CASE
WHEN ISNULL(MetaValueLong,0) > @inID THEN MetaValueLong+1
ELSE @inID+1
END
WHERE MetaKey = 'Internal-ID-Last'
SELECT MetaValueLong
FROM MetaInfo
WHERE MetaKey = 'Internal-ID-Last'
COMMIT TRANSACTION
END
Ma question est simplement: cette procédure stockée fonctionne-t-elle comme prévu (tous les appelants se verront attribuer un résultat unique)?
la source
Réponses:
J'ai jeté un coup d'œil et MS propose lui-même une solution sans verrouillage
http://blogs.msdn.com/b/sqlcat/archive/2006/04/10/sql-server-sequence-number.aspx
Il s'agit d'une simple mise à jour sans indice de verrouillage, mais ils disent que cela verrouille / interbloque.
Rien de bien spécial à ce sujet non plus.
Je serais enclin à ajouter UPDLOCK à votre ROWLOCK (selon "table as a queue" (SO) mais sans READPAST). Cela augmentera l'isolement au cas où un deuxième processus commencerait la lecture.
Cependant, le fait que tous vos processus souhaitent lire / écrire la même ligne me fait me deviner. READPAST permet une concurrence sécurisée mais dans ce cas, il est inutile.
Remarque: vous pouvez utiliser la clause OUTPUT au lieu d'une 2e sélection, alors vous n'avez pas besoin de la transaction.
HTH ...
la source
La chose suivante manque
Oui, il devrait répondre à votre condition. Une fois que de telles situations surviennent dans les transactions, il crée ses multiples instances et par la suite, tous les appelants se verront attribuer un résultat unique
la source
Une solution plus évolutive qui ne nécessite pas de sérialisation est la suivante:
la source