none
Travar transação com subquery RRS feed

  • Pergunta

  • Boa tarde Amigos,

    Estou com uma problema e uma dúvida, vou descrever qual é o cenário:

    Cenário:

    Tenho uma tabela com alguns números disponiveis para serem utilizados na minha aplicação, chamo uma procedure para me retornar um próximo número disponível.

    Problema:

    Essa é uma aplicação comercial e é acessada pelo menos por 300 maquinas (instâncias diferentes de banco) e o que está acontecendo é que quando duas ou mais instâncias chamam essa procedure o número retornado é o mesmo para as duas.

    Dúvida:

    Gostaria de saber se existe alguma forma de travar a transação, e deixar a próxima instância fazer a seleção somente após a anterior, o script está dessa forma:

    DECLARE @NUMERO VARCHAR(10)
    	
    BEGIN TRAN 
    	SELECT  TOP 1 @NUMERO = LTRIM(RTRIM(NUMERO))
    	FROM TAB_NUMERO
    	WHERE UTILIZADO = 'N'
    	ORDER BY NUMERO
    	
    	SET @NUMERO = ISNULL(@NUMERO, -1)
    	IF @NUMERO > 1 BEGIN
    		UPDATE TAB_NUMERO SET UTILIZADO = 'P'
    		WHERE NUMERO = @NUMERO
    	END
    COMMIT TRAN 
    SELECT @NUMERO [NUMERO]

    Sei que se eu fizer um update ou insert o banco efetua o lock automático, mas isso funcionario se eu fizesse update ou insert com subquery?
    Criei o seguinte script:

    BEGIN TRAN
    	DECLARE @TABLE TABLE(NN VARCHAR(10))
    	UPDATE TAB_NUMERO SET UTILIZADO = 'P'
    	WHERE NUMERO = (SELECT TOP 1 LTRIM(RTRIM(NUMERO))
    								FROM TAB_NUMERO
    								WHERE UTILIZADO = 'N'
    								ORDER BY NUMERO)
    	INSERT INTO @TABLE (NN)
    	SELECT TOP 1 LTRIM(RTRIM(NUMERO))
    	FROM TAB_NUMERO
    	WHERE UTILIZADO = 'N'
    	ORDER BY NUMERO
    COMMIT TRAN
    	SELECT NN [NUMERO] FROM @TABLE

    Obrigado à todos.
    segunda-feira, 13 de maio de 2013 18:07

Todas as Respostas