Partilhar via


Personalizando tempo limite de bloqueio

Quando uma instância do MicrosoftMecanismo de Banco de Dados do SQL Server não pode conceder um bloqueio para uma transação porque outra transação já possui um bloqueio conflitante no recurso, a primeira transação fica bloqueada esperando que o bloqueio existente seja liberado. Por padrão, não existe período obrigatório de tempo limite e nenhuma forma para testar se um recurso está bloqueado antes de bloqueá-lo, exceto a tentativa de acessar os dados (e potencialmente ser bloqueado indefinidamente).

ObservaçãoObservação

No SQL Server, use a exibição de gerenciamento dinâmico sys.dm_os_waiting_tasks para determinar se um processo está sendo bloqueado e quem o está bloqueando. Nas versões anteriores do SQL Server, use o procedimento armazenado do sistema sp_who.

A configuração LOCK_TIMEOUT permite que um aplicativo defina um tempo máximo que uma instrução espera um recurso bloqueado. Quando uma instrução espera por mais tempo do que a configuração LOCK_TIMEOUT, a instrução bloqueada é cancelada automaticamente e a mensagem de erro 1222 (Lock request time-out period exceeded) é retornada ao aplicativo. Porém, qualquer transação que contém a instrução não é revertida ou cancelada pelo SQL Server. Portanto, o aplicativo deve ter um identificador de erro que possa interceptar a mensagem de erro 1222. Se um aplicativo não interceptar o erro, o aplicativo poderá continuar sem reconhecer que uma instrução individual dentro de uma transação foi cancelada, e poderão ocorrer erros porque as instruções posteriores da transação podem depender da instrução que nunca foi executada.

A implementação de um identificador de erro que intercepte a mensagem de erro 1222 permite que um aplicativo possa lidar com a situação de tempo limite e execute uma ação para corrigir a situação, como: automaticamente enviar novamente a instrução que estava bloqueada ou reverter toda a transação.

Para determinar a configuração LOCK_TIMEOUT atual, execute a função @@LOCK_TIMEOUT:

SELECT @@lock_timeout;
GO