2011-09-27 4 views
0

J'ai une procédure stockée avec une sélection et une mise à jour. Je voudrais empêcher plusieurs utilisateurs, de l'exécuter, en même temps, donc je ne mets pas à jour, basé sur une sélection incorrecte. Comment le verrouiller? J'ai lu diverses solutions (Transaction isolation, xlock), mais je n'ai pas été capable de comprendre ce que je veux vraiment, et comment le faire.Verrouillage de la procédure stockée

+1

Pouvez-vous ajouter les commandes UPDATE et SELECT s'il vous plaît? – gbn

Répondre

4

Le plus simple est d'oublier les verrous de données mais regardez sp_getapplock pour contrôler l'accès par le code

BEGIN TRY 

    EXEC sp_getapplock ... 

    SELECT ... 

    UPDATE ... 

    EXEC sp_releaseapplock 

END TRY 
... 

Dire que, chose comme la clause de sortie et une utilisation judicieuse des ROWLOCK, UPDLOCK il y a une bonne chances UPDATE et SELECT peuvent être une instruction

0

Utilisation de l'indicateur de table XLOCK dans la requête SELECT:

CREATE TABLE [X]([x] INT NOT NULL) 
GO 

INSERT [X]([x]) SELECT 0 
GO 

CREATE PROCEDURE [ATOMIC] 
AS 
BEGIN 
    BEGIN TRAN 

    DECLARE @x INT = (
     SELECT [x] 
     FROM [X] (XLOCK) 
    ) + 1 

    UPDATE [X] SET [x] = @x 

    COMMIT TRAN 
END 
GO 

Vous pouvez ensuite tester en exécutant

EXEC [ATOMIC] 
GO 10000 

simultanément de différentes sessions. Vous pouvez tester en utilisant

SELECT [x] FROM [X] 

La valeur doit être exactement 10 000 fois le nombre de sessions que vous avez exécutées. Si le nombre est inférieur à ce que vous attendiez, vous n'avez pas de lecture + écriture atomique, ou certains SPID peuvent avoir été détruits en raison d'un verrouillage inactif.