SqlDependency-Abonnement funktioniert bei Verwendung von IsolationLevel.ReadUncommitted in (nicht verwandten?) Transaktionen nicht

Ich habe es geschafft, SqlDependency zum Laufen zu bringen, aber nur solange ich es nicht benutzeIsolationLevel.ReadUncommited Ich dachte, es handelt sich um eine SQL-Transaktion, die nichts mit der SqlDependency zu tun hat.

Wenn ich benutzeIsolationLevel.ReadUncommitted In der Transaktion (unten stark kommentiert) schlägt das SqlDependency-Abonnement mit einem Sofort fehlOnChange Benachrichtigung über:

sqlNotificationEventArgs.Info = "Isolation";
sqlNotificationEventArgs.Source = "Statement";
sqlNotificationEventArgs.Type = "Subscribe";

Wenn ich die IsolationLevel entferne, funktioniert alles wie erwartet (naja, die Isolation stimmt natürlich nicht).

Hier ist mein relevanter Code:

private static string connString = "the connection string";
[MTAThread]
private static void Main(string[] args)
    while(true)
    {
        using (var context = new LinqDataContext(connString))
        {
            var conn = context.Connection;
            conn.Open();
            /***********************************************************************/
            /* Remove `IsolationLevel.ReadUncommitted` and the SqlDependency works */
            /***********************************************************************/
            using (var trans = conn.BeginTransaction(IsolationLevel.ReadUncommitted))
            {
                // simplified query, the real query uses UPDATE OUTPUT INSERTED
                const string sqlCommand = "SELECT [Columns] FROM dbo.[TABLE] WHERE [Status] = 'ready'";
                results = conn.Query({transaction: trans, sql: sqlCommand});
                trans.Commit();
            }
            DoAwesomeStuffWithTheResults(results, context);
        }
        WaitForWork();
    }
}

Der SqlDependency-bezogene Code:

private static ManualResetEvent _quitEvent = new ManualResetEvent(false);

/// <summary>
/// Sets up a SqlDependency a doesn't return until it receives a Change notification
/// </summary>
private static void WaitForWork(){
    // in case we have dependency running we need to go a head and stop it first. 
    SqlDependency.Stop(connString);
    SqlDependency.Start(connString);

    using (var conn = new SqlConnection(connString))
    {
        using (var cmd = new SqlCommand("SELECT [Status] From dbo.[TABLE]", conn))
        {
            cmd.Notification = null;

            var dependency = new SqlDependency(cmd);
            dependency.OnChange += dependency_OnDataChangedDelegate;

            conn.Open();

            cmd.ExecuteReader();
        }
    }
    _quitEvent.WaitOne();
    SqlDependency.Stop(connString);
}
private static void dependency_OnDataChangedDelegate(object sender, SqlNotificationEventArgs e)
{
    ((SqlDependency)sender).OnChange -= dependency_OnDataChangedDelegate;
    _quitEvent.Set();
}

Ich habe das Gefühl, dass ich den Kontext, die Verbindung und die Transaktion ordnungsgemäß entsorgt habe, bevor ich die SqlDependency einrichte, aber anscheinend ist das nicht der Fall.

Was mache ich hier falsch?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage