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

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

2 голосов
/ 27 ноября 2009

Мне нужно уточнить, как 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 Ответ

2 голосов
/ 27 ноября 2009

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

UPDATE

1) Да, MS DTC будет задействован.

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

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

...