5

我正在使用事务的多个插入事务。我使用SqlDependency类让客户端机器知道服务器何时更新。SQL通知支持的隔离级别

我遇到的问题是,无论何时插入使用事务,无论我为事务设置了什么隔离级别,SqlNotificationEventArgs都会返回e.Info作为隔离,这表示我为该事务设置了错误的隔离级别(我认为)。当我不使用交易插入时,一切都运行平稳。

我的问题是,什么是支持的隔离级别,如果有的话,交易中使用SQL通知什么时候?

下面是一些我使用的通知代码:

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

编辑:我是犯在错误的地方事务。

回答

2

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

据微软称:

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

该报价发现于http://msdn.microsoft.com/en-us/library/ms188669.aspx,该报价描述了查询通知如何工作及其要求。