Sql Notification支持的事务隔离级别

时间:2012-02-29 17:24:37

标签: sql sql-server sql-server-2008 transactions isolation-level

我正在使用事务运行多个插入。我正在使用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);
        }
    }
}

对于交易:

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();
}

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

1 个答案:

答案 0 :(得分:2)

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

根据微软的说法:

  

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

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