Sql Notification支持的事务隔离级别

Stu*_*art 5 sql sql-server transactions isolation-level sql-server-2008

我正在使用事务运行多个插入.我正在使用SqlDependency类让客户端机器知道服务器何时更新.

我遇到的问题是每当我使用事务插入时,无论我为事务设置了什么隔离级别,SqlNotificationEventArgs都会将e.Info作为Isolation返回,这表明我为那些事务设置了错误的隔离级别(我认为) .当我在不使用事务的情况下插入时,一切都顺利进行.

我的问题是,使用Sql Notification时,事务支持的隔离级别(如果有)是什么?

以下是我用于通知的一些代码:

void DataChanged(object sender, SqlNotificationEventArgs e) {
    var i = (ISynchronizeInvoke)_form;
    if (i.InvokeRequired) {
        var tempDelegate = new OnChangeEventHandler(DataChanged);
        object[] args = { sender, e };
        i.BeginInvoke(tempDelegate, args);
    } else {
        var dependency = (SqlDependency)sender;
        if (e.Type == SqlNotificationType.Change) {
            dependency.OnChange -= DataChanged;
            GetData(dependency);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

对于交易:

public void ExecuteNonQueryData(List<string> commandTexts) {
    SqlConnection connection = null;
    var command = new SqlCommand();
    SqlTransaction transaction = null;
    try {
        connection = new SqlConnection(GetConnectionString());
        connection.Open();
        transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted);
        foreach (var commandText in commandTexts) {
            try {
                command.Connection = connection;
                command.CommandText = commandText;
                command.Transaction = transaction;
                command.ExecuteNonQuery();
            } catch (Exception ex) {
                Console.WriteLine(ex.Message);
            }
        }
        transaction.Commit();
    } catch (Exception ex) {
        Console.WriteLine(ex.Message);
    } finally {
        command.Dispose();
        if (transaction != null) transaction.Dispose();
        if (connection != null) {
            connection.Close();
            connection.Dispose();
        }
    }
    commandTexts.Clear();
}
Run Code Online (Sandbox Code Playgroud)

编辑:我在错误的地方提交交易.

Stu*_*art 2

显然查询通知不支持事务。删除交易代码解决了这个问题。

根据微软的说法:

Transact-SQL 不提供订阅通知的方法。SQL Server 中托管的 CLR 数据访问类不支持查询通知。

此引用位于http://msdn.microsoft.com/en-us/library/ms188669.aspx,它描述了查询通知的工作原理及其要求。