5

Я запускаю несколько вложений с использованием транзакций. Я использую класс SqlDependency, чтобы сообщить машине клиента, когда сервер был обновлен.Sql Уведомление Поддерживаемые уровни изоляции для транзакций

Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я вставляю транзакции, независимо от того, какой уровень изоляции я устанавливаю для транзакции, SqlNotificationEventArgs возвращает e.Info как изоляцию, которая указывает, что у меня есть неправильный уровень изоляции, установленный для этих транзакций (Я думаю). Когда я вставляю без использования транзакции, все выполняется гладко.

Мои вопросы: какие поддерживаемые уровни изоляции, если таковые имеются, для транзакций при использовании 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(); 
} 

Edit: я совершал сделку в неправильном месте.

ответ

2

Видимо, уведомление о запросе не поддерживает транзакции. Исправлена ​​ошибка с кодом транзакции.

Согласно Microsoft:

Transact-SQL не предоставляет способ подписаться на получение уведомлений. Классы доступа к данным CLR, размещенные в SQL Server, не поддерживают уведомления о запросах.

Эта цитата была найдена в http://msdn.microsoft.com/en-us/library/ms188669.aspx, в которой описано, как работают уведомления о запросах и их требования.

Смежные вопросы