2012-02-29 106 views
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,該報價描述了查詢通知如何工作及其要求。