2

我需要澄清一下 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();
    }
}

谢谢

4

1 回答 1

2

Serializable 是默认隔离级别,但MS DTC 将遵循您在 TransactionOptions 中指定的隔离级别

更新

1) 是的,将涉及 MS DTC。

1a) 否(见上文)。

1b) 前面的答案不是肯定的,但据我了解,READ_COMMITTED_SNAPSHOT 仅在隔离级别被读取提交时才有效。其他隔离级别将强制执行它们自己的锁定模型。“当 READ_COMMITTED_SNAPSHOT 选项设置为 ON 时,读提交隔离级别下的读操作基于行版本,并以非锁定模式执行。”

于 2009-11-27T05:16:02.400 回答