Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Абонаментът за SqlDependency не работи при използване на IsolationLevel.ReadUncommitted в (несвързана?) транзакция

Поздравления за получаването на SqlDependency работи (изобщо не съм саркастичен, много се бяха провалили в това).

Сега е време да прочетете Създаване на заявка за известяване тема в MSDN. Ще видите условията, при които заявките са валидни за известия, включително това изискване:

Писах за основите на това как SqlDependency работи , може би ще изясни някои недоразумения. И като страничен възел, тъй като използвате Linq, може да се интересувате от LinqToCache , който осигурява мост между Linq заявки и SqlDependency .

Друг коментар:не използвайте Start() и Stop() вашата SqlDependency неволю-неволю. Скоро ще съжаляваш. Start() трябва да се извика точно веднъж, по време на стартиране на приложението, и Stop() точно веднъж по време на изключване на приложението (стриктно погледнато, е по време на зареждане и разтоварване на домейна на приложението).

Сега относно вашия проблем:нивото на изолация, което има значение, е това на уведомената заявка . Това означава, че заявката, към която прикачвате абонамента, не заявката, на която извършвате UPDATE (Няма да коментирам мъдростта на извършването на UPDATE при мръсни четения... или мъдростта да се използват мръсни четения за всичко ). Доколкото мога да кажа, кодът, който показвате, не трябва да публикува заявката под read_uncommitted. След като издадете SET TRANSACTION ISOLATION ... всички последващи транзакции ( следователно всички изрази) в тази сесия ще бъдат под това ниво на изолация. Затваряте връзката (чрез изхвърляне на DataContext) и след това използвате различна връзка. Освен ако ... не използвате пулове за свързване. Добре дошли в клуба на невинните жертви :). Обединяването на връзки течове променя нивото на изолация в Close() /Open() граници . И това е ваш проблем. Има няколко лесни решения:

  • Можете (задължително!) да нулирате нивото на изолация изрично след Open()
  • Можете да използвате обхвати на System.Transactions (моята препоръка). Задължително за четене: използване на new TransactionScope() се счита за вредно
  • Не използвайте групиране на връзки.

И докато говорим, трябва да прочетете и това: Използване на таблици като опашки .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Архивиране на SQL Server 2017 -2

  2. SQL Server съобщава „Невалидно име на колона“, но колоната присъства и заявката работи чрез студио за управление

  3. Предаване на множество стойности към параметър на функция в SQL

  4. Грешка при инсталиране на sql сървър 2012 Entreprise Edition

  5. Представяме ви нова функция - репликация в облака на Spotlight