Congratulazioni per aver ottenuto SqlDependency
lavorando (non sono affatto sarcastico, molti avevano fallito in questo).
Ora è il momento di leggere Creazione di una query per la notifica argomento su MSDN. Vedrai le condizioni in base alle quali le query sono valide per le notifiche, incluso questo requisito:
Ho scritto su le basi di come SqlDependency
funziona
, forse chiarirà alcuni malintesi. E, come nodo laterale, poiché stai utilizzando Linq, potresti essere interessato a LinqToCache , che fornisce un ponte tra Linq
query e SqlDependency
.
Un altro commento:non Start()
e Stop()
la tua SqlDependency
malvolentieri. Te ne pentirai presto. Start()
dovrebbe essere chiamato esattamente una volta, durante l'avvio dell'app, e Stop()
esattamente una volta durante l'arresto dell'app (in senso stretto, è durante il caricamento e lo scaricamento del dominio dell'app).
Ora, riguardo al tuo problema:il livello di isolamento che conta è quello della query notificata . Ciò significa che la query a cui alleghi l'abbonamento, non la query su cui esegui l'UPDATE
(Non commenterò la saggezza di fare UPDATE sotto letture sporche... o la saggezza di usare letture sporche per qualsiasi cosa
). Per quanto ne so, il codice che mostri non dovrebbe pubblicare la query in read_uncommitted. Dopo aver emesso un SET TRANSACTION ISOLATION ...
tutte le transazioni successive (ergo tutte le dichiarazioni) in quella sessione saranno sotto quel livello di isolamento. Si chiude la connessione (tramite l'eliminazione di DataContext) e quindi si utilizza una connessione diversa. A meno che... non utilizzi pool di connessione. Benvenuti nel club delle vittime innocenti :). Il pool di connessioni perde le modifiche al livello di isolamento in Close()
/Open()
confini
. E questo è il tuo problema. Ci sono alcune soluzioni facili:
- Puoi (devi!) reimpostare il livello di isolamento in modo esplicito dopo
Open()
- Puoi usare gli ambiti System.Transactions (il mio consiglio). Lettura obbligatoria: utilizzando il nuovo TransactionScope() considerato nocivo
- Non utilizzare il pool di connessioni.
E mentre parliamo, devi leggere anche questo: Utilizzo delle tabelle come code .