Como cancelo uma solicitação de bloqueio de aplicativo no SQL Server?

25

O procedimento armazenado sp_getapplock possui os seguintes valores de retorno:

0: o bloqueio foi concedido com êxito de forma síncrona.
1: O bloqueio foi concedido com êxito depois de aguardar o lançamento de outros bloqueios incompatíveis.
-1: A solicitação de bloqueio expirou.
-2: A solicitação de bloqueio foi cancelada.
-3: A solicitação de bloqueio foi escolhida como vítima de impasse.
-999: indica uma validação de parâmetro ou outro erro de chamada.

Estou escrevendo um invólucro para chamar sp_getapplocknossa camada de acesso a dados e quero saber sob quais circunstâncias -2 podem ser retornadas para que eu possa lançar uma exceção descritiva e útil. É óbvio o que os valores de retorno de -1 e -3 significam e posso criar facilmente condições de teste que fazem com que esses valores sejam retornados. Como eu conseguiria obter um valor de retorno -2?

Heinzi
fonte

Respostas:

5

Observando a origem do processo do sp_getapplockwrapper, todos os valores de retorno, com exceção de -999, se originam do sys.xp_userlock procedimento armazenado interno subjacente . Aposto que o proc interno retorna um -2 quando a solicitação é cancelada por um evento de atenção (tempo limite da consulta do cliente ou cancelamento explícito da consulta do cliente). No entanto, nenhum sp_getapplockcódigo adicional é executado após o lote ser cancelado, incluindo a RETURNinstrução Conseqüentemente, o código de retorno -2 pode ser retornado internamente, mas não há maneira prática de o cliente obter o valor.

Supondo que essa teoria esteja correta, não há valor em traduzir para -2 para uma mensagem mais descritiva, pois foi o cliente que cancelou a solicitação em primeiro lugar.

Deixo para Paul confirmar isso, percorrendo o código do mecanismo de banco de dados SQL com um depurador :-)

Dan Guzman
fonte
1

sp_getapplock cria bloqueios em semáforos, não em objetos físicos (por MSDN). Ele bloqueará outro processo apenas se for sp_getapplock com a mesma string e um modo de bloqueio incompatível.

Portanto, as solicitações de bloqueio seriam canceladas em circunstâncias como: um usuário com privilégios mais altos cancela o bloqueio, um processo do servidor cancela o bloqueio, o usuário executando o procedimento armazenado ou um administrador conclui o processo de bloqueio. Sua descrição pode ser "bloqueio cancelado pelo sistema ou outro usuário". Não sei como você determinaria o processo / usuário real que cancelou o bloqueio.

Ben Schmeltzer
fonte
-1

Há um procedimento armazenado de bloqueio de aplicativo Release correspondente chamado sp_releaseapplock.

Eu escrevi um artigo confusamente intitulado "Mutexes no SQL" aqui no SQL Server Central sobre o uso desses procedimentos armazenados para controlar o fluxo do aplicativo.

Toby
fonte
4
Parece que você está respondendo à pergunta no título, mas a pergunta real é "Em que circunstâncias o sp_getapplock retornará -2?"
Martin Smith
Pedido de bloqueio cancelado. Na verdade, isso é estranho. Como o processo cancelaria sua própria solicitação de bloqueio sem saber que ele foi cancelado! Talvez você precise aceitar que não pode dar um erro significativo que não seja o fornecido pela MS - "A solicitação de bloqueio foi cancelada".
Toby