Dire que j'ai le tableau suivant:SELECT et UPDATE table donc il n'y a pas de chevauchement de threads
ID|Read
-------
1|true
2|false
3|false
4|false
... et je dois lire l'ID le plus petit, qui a [Lire] == false; plus, mise à jour que je l'ai maintenant lu. Donc si j'exécute mon dbo.getMinID de procédure stockée, il renverra l'ID: 2, et mettra à jour [Read] -> true.
CREATE PROCEDURE [dbo].[getMinID]
(
@QueryID INT OUTPUT
)
BEGIN
SELECT TOP 1 @QueryID = [ID] from Table
UPDATE Table SET [Read] = 1 WHERE [ID] = @QueryID
END
Le problème est que je dix (10) Fils asynchrones exécuter dbo.getMinID, en même temps, et je ne peux pas les sélectionner le même [ID] en aucun cas. Je suis inquiet qu'un second thread s'exécute entre mes instructions SELECT et UPDATE, retournant [ID]: 2 dans les deux scénarios.
Comment puis-je m'assurer de ne pas sélectionner/mettre à jour le même enregistrement deux fois, quel que soit le nombre de threads agissant sur la procédure stockée? AUSSI, gardez à l'esprit que la table a CONSTANTLY de nouvelles lignes ajoutées, donc je ne peux pas verrouiller la table!
sera min, ne pas déclencher un verrou sur toutes les lignes? ou est-ce que je dis juste un non-sens –
verrou partagé qui est en lecture seule, et il passera d'autres verrous à cause de READPAST. Peu importe, vraiment ... – gbn