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

Assinatura SqlDependency não funciona ao usar IsolationLevel.ReadUncommitted em (não relacionado?) Transação


Parabéns por obter SqlDependency funcionando (não estou sendo sarcástico, muitos falharam nisso).

Agora é hora de ler Criando uma consulta para notificação tópico no MSDN. Você verá as condições em que as consultas são válidas para notificações, incluindo este requisito:

Eu escrevi sobre os conceitos básicos de como SqlDependency funciona , talvez irá esclarecer alguns mal-entendidos. E, como um nó lateral, como você está usando o Linq, pode estar interessado em LinqToCache , que fornece uma ponte entre Linq consultas e SqlDependency .

Outro comentário:não Start() e Stop() sua SqlDependency à toa. Você vai se arrepender em breve. Start() deve ser chamado exatamente uma vez, durante a inicialização do aplicativo, e Stop() exatamente uma vez durante o desligamento do aplicativo (estritamente falando, é durante o carregamento e descarregamento do domínio do aplicativo).

Agora, sobre o seu problema:o nível de isolamento que importa é o da consulta notificada . Isso significa que a consulta à qual você anexa a assinatura, não a consulta na qual você faz o UPDATE (Não vou comentar sobre a sabedoria de fazer UPDATE sob leituras sujas... ou a sabedoria de usar leituras sujas para qualquer coisa ). Até onde eu sei, o código que você mostra não deve postar a consulta em read_uncommitted. Depois de emitir um SET TRANSACTION ISOLATION ... todas as transações subsequentes (portanto, todas as instruções) nessa sessão estarão sob esse nível de isolamento. Você fecha a conexão (por meio do descarte do DataContext) e, em seguida, usa uma conexão diferente. A menos que... você use pools de conexão. Bem-vindo ao clube das vítimas inocentes :). O pool de conexões vaza alterações no nível de isolamento em Close() /Open() limites . E esse é o seu problema. Existem algumas soluções fáceis:

E enquanto estamos falando, você precisa ler isso também: Usando tabelas como filas .