sql >> Databasteknik >  >> RDS >> Sqlserver

SqlDependency-prenumerationen fungerar inte när man använder IsolationLevel.ReadUncommitted i (orelaterade?) Transaktion

Grattis till att du fått SqlDependency arbetar (jag är inte sarkastisk alls, många hade misslyckats med detta).

Nu är det dags att läsa Skapa en fråga för avisering ämne på MSDN. Du kommer att se villkoren under vilka frågor är giltiga för aviseringar, inklusive detta krav:

Jag skrev om grunderna för hur SqlDependency fungerar , kanske kommer att reda ut vissa missförstånd. Och eftersom du använder Linq som en sidoknut kanske du är intresserad av LinqToCache a> , som ger en brygga mellan Linq frågor och SqlDependency .

En annan kommentar:gör inte Start() och Stop() din SqlDependency nilly-willy. Du kommer snart att ångra dig. Start() är tänkt att anropas exakt en gång, under appstart, och Stop() exakt en gång under appavstängning (är strikt taget under laddning och avlastning av appdomän).

Nu, om ditt problem:isoleringsnivån som är viktig är den för aviserade frågan . Det betyder att frågan som du bifogar prenumerationen till, inte frågan som du gör UPDATE på (Jag kommer inte att kommentera klokheten i att göra UPPDATERING under smutsiga läsningar... eller förståndet att använda smutsiga läsningar för vad som helst ). Såvitt jag kan se bör koden du visar inte lägga upp frågan under read_uncommitted. När du har utfärdat en SET TRANSACTION ISOLATION ... alla efterföljande transaktioner (ergo alla uttalanden) i den sessionen kommer att ligga under den isoleringsnivån. Du stänger anslutningen (via avyttringen av DataContext) och använder sedan en annan anslutning. Om du inte använder anslutningspooler. Välkommen till klubben av oskyldiga offer :). Anslutningspoolning läcker isoleringsnivåförändringar över Close() /Open() gränser . Och det är ditt problem. Det finns några enkla lösningar:

  • Du kan (måste!) återställa isoleringsnivån uttryckligen efter Open()
  • Du kan använda System.Transactions-omfång (min rekommendation). Obligatorisk läsning: använder nya TransactionScope() anses skadligt
  • Använd inte anslutningspoolning.

Och medan vi pratar, måste du också läsa detta: Använda tabeller som köer .



  1. SQLite CASE

  2. MySQL - tvinga att inte använda cache för att testa frågans hastighet

  3. Bash + MySQL -d backtick-problem

  4. Skapar DBMS_SCHEDULER-jobb för Oracle