5

トランザクションを使用して複数の挿入を実行しています。私はSqlDependencyクラスを使用して、サーバーが更新されたときにクライアントマシンに知らせる。Sql通知トランザクションのサポート分離レベル

問題は、トランザクションを使用して挿入するときはいつでも、トランザクションに対して設定した分離レベルに関係なく、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(); 
} 

編集:私は間違った場所にトランザクションをコミットました。

答えて

2

明らかにクエリ通知はトランザクションをサポートしていません。トランザクションコードを削除すると、この問題が修正されました。 Microsoftによると

のTransact-SQLには、通知をサブスクライブする方法を提供していません。 SQL Server内でホストされているCLRデータアクセスクラスはクエリ通知をサポートしていません。

この見積もりは、http://msdn.microsoft.com/en-us/library/ms188669.aspxにあります。これは、クエリ通知の仕組みと要件を示しています。

関連する問題