sql >> Base de Datos >  >> RDS >> Sqlserver

La suscripción de SqlDependency no funciona cuando se usa IsolationLevel.ReadUncommitted en una transacción (¿no relacionada?)

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:

Y mientras hablamos, también debe leer esto: Uso de tablas como colas .