我需要澄清MS-DTC在下面给出的场景中的表现
1)我在transactioncope(隔离级别 - 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();
}
}
由于
答案 0 :(得分:2)
Serializable是默认的隔离级别,但MS DTC will respect the Isolation Level you specify in your TransactionOptions。
<强>更新强>
1)是的,MS DTC将参与其中。
1a)否(见上文)。
1b)之前的答案不是肯定的,但我的理解是READ_COMMITTED_SNAPSHOT仅在读取隔离级别时才生效。其他隔离级别将强制执行自己的锁定模型。 "When the READ_COMMITTED_SNAPSHOT option is set to ON, read operations under the read committed isolation level are based on row versions and are executed in a nonlocking mode."