sql >> Databáze >  >> RDS >> Sqlserver

Předplatné SqlDependency nefunguje při použití IsolationLevel.ReadUncommitted v (nesouvisející?) transakci

Gratulujeme k získání SqlDependency pracovní (vůbec nejsem sarkastický, mnozí v tom selhali).

Nyní je čas přečíst si Vytvoření dotazu pro oznámení téma na MSDN. Uvidíte podmínky, za kterých jsou dotazy platné pro oznámení, včetně tohoto požadavku:

Napsal jsem o základech toho, jak SqlDependency funguje , možná vyjasní některá nedorozumění. A jako vedlejší uzel, protože používáte Linq, by vás mohla zajímat LinqToCache , který poskytuje most mezi Linq dotazy a SqlDependency .

Další komentář:ne Start() a Stop() vaše SqlDependency chtě nechtě. Brzy toho budeš litovat. Start() má být volána přesně jednou, během spouštění aplikace, a Stop() přesně jednou během vypínání aplikace (přesně řečeno je to během načítání a vyjímání domény aplikace).

Nyní k vašemu problému:na úrovni izolace, která je důležitá, je úroveň oznámeného dotazu . To znamená, že dotaz, ke kterému připojíte předplatné, ne dotaz, na kterém provedete UPDATE (Nebudu komentovat moudrost provádění UPDATE pod špinavým čtením... nebo moudrost používat špinavé čtení pro cokoli ). Pokud mohu říci, kód, který zobrazíte, by neměl dotaz zveřejňovat pod read_uncommitted. Po vydání SET TRANSACTION ISOLATION ... všechny následující transakce (tedy všechny příkazy) v této relaci budou pod touto úrovní izolace. Uzavřete připojení (prostřednictvím likvidace DataContext) a poté použijete jiné připojení. Pokud... nepoužíváte fondy připojení. Vítejte v klubu nevinných obětí :). Změny úrovně izolace úniků sdružování připojení v rámci Close() /Open() hranice . A to je váš problém. Existuje několik snadných řešení:

A když už mluvíme, musíte si také přečíst toto: Použití tabulek jako front .



  1. Pokračování na Summer Performance Palooza 2013

  2. Datum MySQL se po uložení JPA změní na včerejší datum

  3. Více než 60 sekund nebo minut v souboru importu MySQL

  4. Je bezpečné umístit index na dočasnou tabulku Oracle?