Sintomas
Considere o seguinte cenário:
-
Você tem um banco de dados com as opções ALLOW_SNAPSHOT_ISOLATION e READ_COMMITTED_SNAPSHOT habilitados no Microsoft SQL Server 2008 R2.
-
Você executa uma instrução Select que contém dicas TABLOCK e UPDLOCK em relação a uma tabela no banco de dados.
-
A instrução Select é encapsulada em um BEGIN TRANexplícito, mas Commit Tran não é executada.
-
Duas mais das mesmas consultas que são iniciadas com as mesmas dicas de consulta estão na transação explícita.
Nesse cenário, quando a primeira consulta for confirmada, uma das outras consultas será deadlock.
Causa
O problema ocorre porque o SQL Server incorretamente informa o deadlock em um dos seguintes cenários:
-
Quando ALLOW_SNAPSHOT_ISOLATION e READ_COMMITTED_SNAPSHOT são habilitados para um banco de dados, várias consultas na mesma transação podem ser reportadas como travadas incorretamente quando uma delas é concluída.
-
Quando ALLOW_SNAPSHOT_ISOTION é habilitado e as dicas TABLOCK e UPDLOCK são usadas, a segunda e a terceira instrução Select tem a intenção de converter para X. O IX trava o deadlock para terminar quando uma tentativa de converter para X é feita.
-
Quando o ALLOW_SNAPSHOT_ISOLATION estiver desabilitado, a segunda e a terceira consulta obterá seis travas. Nessa situação, quando o SIX Lock é convertido em X, ele é apenas um cenário de bloqueio, não um deadlock.
Resolução
O problema foi corrigido primeiro na atualização cumulativa a seguir do SQL Server. Depois de aplicar o hotfix, o SQL Server resolve o problema gravando se uma dica de confirmação de leitura ou uma dica NOLOCK for encontrada para o banco de dados e consulta. Essas informações são usadas para selecionar o tipo correto de bloqueios para manipular a situação corretamente, em vez de relatar o deadlock incorretamente.
Atualização cumulativa 11 para SQL Server 2008 R2 SP2 /en-us/help/2926028
Cada nova atualização cumulativa do SQL Server contém todos os hotfixes e todas as correções de segurança incluídas na atualização cumulativa anterior. Confira as atualizações cumulativas mais recentes do SQL Server:
Status
A Microsoft confirmou que este é um problema nos produtos Microsoft listados na seção "Aplicável a".