SqlDependency
取得おめでとうございます (私はまったく皮肉を言っているわけではありません。多くの人がこれで失敗しました)。
ここで、「通知用クエリの作成」をお読みください。 MSDN のトピック。この要件を含め、クエリが通知に対して有効な条件が表示されます。
方法の基本 SqlDependency
について書きました 作品
、多分いくつかの誤解を解くでしょう。また、サイド ノードとして、Linq を使用しているため、LinqToCacheに興味があるかもしれません。> Linq
間のブリッジを提供します クエリと SqlDependency
.
別のコメント:Start()
しないでください および Stop()
あなたの SqlDependency
ニリーウィリー。すぐに後悔するでしょう。 Start()
アプリの起動時に一度だけ呼び出され、Stop()
アプリのシャットダウン中に 1 回だけ (厳密に言えば、アプリドメインのロードとアンロード中に)。
さて、あなたの問題について:重要な分離レベルは、notified query の 1 つです .つまり、サブスクリプションをアタッチするクエリではなく、 UPDATE
を実行するクエリ (ダーティ リードの下で UPDATE を実行することの賢明さについてはコメントしません... または 何にでもダーティ リードを使用する知恵
)。私が知る限り、あなたが示すコードは、read_uncommitted の下にクエリを投稿するべきではありません。 SET TRANSACTION ISOLATION ...
を発行した後 そのセッションの後続のすべてのトランザクション (つまり、すべてのステートメント) は、その分離レベルの下になります。 (DataContext の破棄によって) 接続を閉じてから、別の接続を使用します。 ...接続プールを使用しない限り。無実の犠牲者のクラブへようこそ:)。 接続プーリングが Close()
全体で分離レベルの変更をリークする /Open()
境界
.そして、それはあなたの問題です。いくつかの簡単な解決策があります:
Open()
の後で分離レベルを明示的にリセットできます (しなければなりません!)。- System.Transactions スコープを使用できます (私の推奨事項)。必読: new TransactionScope() の使用は有害と見なされます
- 接続プールを使用しないでください。
そして、私たちが話している間、これも読む必要があります:テーブルをキューとして使用 .