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:- Você pode (deve!) redefinir o nível de isolamento explicitamente após
Open()
- Você pode usar escopos System.Transactions (minha recomendação). Leitura obrigatória: usando new TransactionScope() considerado prejudicial
- Não use o pool de conexões.
E enquanto estamos falando, você precisa ler isso também: Usando tabelas como filas .