Gefeliciteerd met het behalen van SqlDependency
werken (ik ben helemaal niet sarcastisch, velen hadden hierin gefaald).
Nu is het tijd om Een query voor melding maken te lezen onderwerp op MSDN. U ziet de voorwaarden waaronder zoekopdrachten geldig zijn voor meldingen, inclusief deze vereiste:
Ik schreef over de basisprincipes van hoe SqlDependency
werkt
, zal misschien een aantal misverstanden ophelderen. En aangezien u Linq gebruikt als zijknooppunt, bent u wellicht geïnteresseerd in LinqToCache , die een brug vormt tussen Linq
query's en SqlDependency
.
Nog een opmerking:niet Start()
en Stop()
uw SqlDependency
nilly-willy. Je zult er snel spijt van krijgen. Start()
hoort precies één keer te worden aangeroepen, tijdens het opstarten van de app, en Stop()
precies één keer tijdens het afsluiten van de app (strikt genomen is dit tijdens het laden en lossen van het appdomein).
Nu, over uw probleem:het isolatieniveau dat van belang is, is dat van de aangemelde zoekopdracht . Dat betekent dat de zoekopdracht waaraan u het abonnement koppelt, niet de query waarop u de UPDATE
. doet (Ik zal geen commentaar geven op de wijsheid van het doen van UPDATE onder dirty reads... of de wijsheid van het gebruik van vuile reads voor alles
). Voor zover ik weet, mag de code die u laat zien de query niet onder read_uncommitted plaatsen. Nadat u een SET TRANSACTION ISOLATION ...
alle volgende transacties (dus alle afschriften) in die sessie vallen onder dat isolatieniveau. U sluit de verbinding (via het afstoten van de DataContext) en gebruikt vervolgens een andere verbinding. Tenzij ... u verbindingspools gebruikt. Welkom bij de club van onschuldige slachtoffers :). Verbindingspooling lekken isolatieniveau verandert over Close()
/Open()
grenzen
. En dat is jouw probleem. Er zijn enkele eenvoudige oplossingen:
- U kunt (moet!) het isolatieniveau expliciet opnieuw instellen na
Open()
- U kunt System.Transactions-bereiken gebruiken (mijn aanbeveling). Verplicht leesvoer: het gebruik van nieuwe TransactionScope() wordt als schadelijk beschouwd
- Gebruik geen pooling van verbindingen.
En terwijl we aan het praten zijn, moet je dit ook lezen: Tabellen als wachtrijen gebruiken .