Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server:evitando leituras sujas em um procedimento armazenado


Você não pode evitar leituras sujas. Os escritores usam bloqueios exclusivos para evitar leituras honestas e confirmadas. Mas não há nada você pode fazer para evitar leituras sujas. O leitor sujo tem que parar de fazer leituras sujas, ponto final.

Supondo que o código que pesquisa a tabela Customer esteja sob seu controle, a solução é remover a dica de leitura suja da consulta. Isso provavelmente causará contenção, já que a sondagem agora bloqueará as gravações. A melhor solução para isso é habilitar o versão de linha :
ALTER DATABASE [<DBNAME>] SET ALLOW_SNAPSHOT_ISOLATION ON; 
ALTER DATABASE [<DBNAME>] SET READ_COMMITTED_SNAPSHOT ON;

Em seguida, simplesmente faça uma pesquisa do Cliente como uma consulta normal, sem nenhuma dica. Sua enquete não bloqueará gravações, pois o controle de versão de linha será ativado e redirecionará a verificação de consulta para uma versão pré-atualização e não bloqueada da linha.

Mais uma nota:sondagem a cada 500ms? Talvez você deva usar um mecanismo de notificação de consulta para invalidar seus caches, consulte The Mysterious Notificação .