Felicidades por obtener SqlDependency
trabajando (no estoy siendo sarcástico en absoluto, muchos habían fallado en esto).
Ahora es el momento de leer Creación de una consulta para notificación tema en MSDN. Verá las condiciones bajo las cuales las consultas son válidas para las notificaciones, incluido este requisito:
Escribí sobre los conceptos básicos de cómo SqlDependency
funciona
, tal vez aclare algunos malentendidos. Y, como nodo secundario, ya que está utilizando Linq, puede estar interesado en LinqToCache , que proporciona un puente entre Linq
consultas y SqlDependency
.
Otro comentario:no Start()
y Stop()
su SqlDependency
nilly-willy. Te arrepentirás pronto. Start()
se supone que debe llamarse exactamente una vez, durante el inicio de la aplicación, y Stop()
exactamente una vez durante el cierre de la aplicación (estrictamente hablando, es durante la carga y descarga del dominio de la aplicación).
Ahora, sobre su problema:el nivel de aislamiento que importa es el de la consulta notificada . Eso significa que la consulta en la que adjunta la suscripción, no la consulta en la que realiza la UPDATE
(No comentaré sobre la sabiduría de hacer ACTUALIZAR en lecturas sucias... o la sabiduría de usar lecturas sucias para cualquier cosa
). Por lo que puedo decir, el código que muestra no debe publicar la consulta en read_uncommitted. Después de emitir un SET TRANSACTION ISOLATION ...
todas las transacciones subsiguientes (ergo, todas las declaraciones) en esa sesión estarán bajo ese nivel de aislamiento. Cierra la conexión (a través de la disposición del DataContext) y luego usa una conexión diferente. A menos que... utilice grupos de conexiones. Bienvenido al club de las víctimas inocentes :). La agrupación de conexiones pierde cambios en el nivel de aislamiento en Close()
/Open()
límites
. Y ese es tu problema. Hay algunas soluciones fáciles:
- Puede (¡debe!) restablecer el nivel de aislamiento explícitamente después de
Open()
- Puede usar los ámbitos de System.Transactions (mi recomendación). Lectura obligatoria: usando el nuevo TransactionScope() considerado dañino
- No utilice la agrupación de conexiones.
Y mientras hablamos, también debe leer esto: Uso de tablas como colas .