Sql Уведомление Поддерживаемые уровни изоляции для транзакций - PullRequest
5 голосов
/ 29 февраля 2012

Я выполняю несколько операций вставки с использованием транзакций. Я использую класс 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 Ответ

2 голосов
/ 01 марта 2012

Видимо, Query Notification не поддерживает транзакции.Удаление кода транзакции устранило эту проблему.

Согласно Microsoft:

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

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

...