MSDTC и уровень изоляции

Мне нужно уточнить, как MS-DTC будет вести себя в сценарии, приведенном ниже.

1) У меня есть более одного соединения в пределах области транзакций (уровень изоляции - ReadCommited), что теперь приведёт в действие MS-DTC:

a) MS-DTC автоматически изменит уровень изоляции на SERIALIZABLE.

b) (Imp) Если ответ выше положительный, и я реализовал уровень изоляции на основе управления версиями строк, т.е. в дополнение к TransactionScope, я также включил опцию базы данных READ_COMMITTED_SNAPSHOT "ON", останется ли это в силе, значит, будет поддерживать изоляцию "SERIALIZABLE" уровень.

void OuterMethod() {
    TransactionOptions tso = new TransactionOptions();
    tso.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
    using (TransactionScope tx = new TransactionScope(TransactionScopeOption.RequiresNew, tso)) {
        InnerMethod("select * from testtable");
        InnerMethod("update testtable set col1 = N'new value'");
        tx.Complete();
    }
}

static void InnerMethod(string sqlText) {
    using (SqlConnection conn = SqlConnection(connStr)) {
        conn.Open();
        SqlCommand cmd = conn.CreateCommand();
        cmd.ExecuteNonQuery();
    }
}

Спасибо

1 ответ

Решение

Сериализуемый - это уровень изоляции по умолчанию, но MS DTC будет учитывать уровень изоляции, указанный вами в TransactionOptions.

ОБНОВИТЬ

1) Да, MS DTC будет участвовать.

1а) Нет (см. Выше).

1b) Предыдущий ответ не да, но, насколько я понимаю, READ_COMMITTED_SNAPSHOT действует только в том случае, если уровень изоляции считывается зафиксированным. Другие уровни изоляции будут применять свою собственную модель блокировки. "Когда для параметра READ_COMMITTED_SNAPSHOT установлено значение ON, операции чтения с уровнем изоляции зафиксированного чтения основаны на версиях строк и выполняются в режиме без блокировки".

Другие вопросы по тегам