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, операции чтения с уровнем изоляции зафиксированного чтения основаны на версиях строк и выполняются в режиме без блокировки".