Herzlichen Glückwunsch zum Erwerb von SqlDependency
arbeiten (ich bin überhaupt nicht sarkastisch, viele sind daran gescheitert).
Lesen Sie jetzt Erstellen einer Abfrage für Benachrichtigungen Thema auf MSDN. Sie sehen die Bedingungen, unter denen Abfragen für Benachrichtigungen gültig sind, einschließlich dieser Anforderung:
Ich habe über die Grundlagen von SqlDependency
geschrieben funktioniert
, klärt vielleicht einige Missverständnisse auf. Und als Nebenknoten, da Sie Linq verwenden, könnten Sie an LinqToCache , das eine Brücke zwischen Linq
bereitstellt Abfragen und SqlDependency
.
Noch ein Kommentar:nicht Start()
und Stop()
Ihre SqlDependency
nilly-willy. Du wirst es bald bereuen. Start()
genau einmal aufgerufen werden soll, während des App-Starts, und Stop()
genau einmal während des Herunterfahrens der App (genau genommen während des Ladens und Entladens der App-Domäne).
Nun zu Ihrem Problem:Die Isolationsstufe, auf die es ankommt, ist die der benachrichtigten Abfrage . Das heißt, die Abfrage, an die Sie das Abonnement anhängen, nicht die Abfrage, für die Sie das UPDATE
durchführen (Ich werde die Weisheit, UPDATE unter Dirty Reads durchzuführen, nicht kommentieren ... oder die Weisheit, Dirty Reads für alles zu verwenden
). Soweit ich das beurteilen kann, sollte der von Ihnen angezeigte Code die Abfrage nicht unter read_uncommitted posten. Nachdem Sie ein SET TRANSACTION ISOLATION ...
ausgegeben haben Alle nachfolgenden Transaktionen (also alle Anweisungen) in dieser Sitzung befinden sich unter dieser Isolationsstufe. Sie schließen die Verbindung (über das Löschen des DataContext) und verwenden dann eine andere Verbindung. Es sei denn ... Sie verwenden Verbindungspools. Willkommen im Club der unschuldigen Opfer :). Verbindungspooling gibt Änderungen der Isolationsstufe über Close()
preis /Open()
Grenzen
. Und das ist dein Problem. Es gibt einige einfache Lösungen:
- Sie können (müssen!) den Isolation Level explizit nach
Open()
zurücksetzen - Sie können System.Transactions-Bereiche verwenden (meine Empfehlung). Pflichtlektüre: Verwendung von new TransactionScope() als schädlich angesehen
- Verwenden Sie kein Verbindungspooling.
Und während wir reden, müssen Sie auch dies lesen: Verwenden von Tabellen als Warteschlangen .