msdtc 和隔离级别

发布于 2024-08-12 19:42:03 字数 925 浏览 9 评论 0原文

我需要一些澄清,MS-DTC 在下面给出的场景中将如何表现

1) 我在一个事务范围内有多个连接(隔离级别 - ReadCommited),这将使 MS-DTC 现在开始运行:

a) MS-DTC 会自动执行吗将隔离级别更改为可串行化。

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();
    }
}

谢谢

I need some clarification how MS-DTC will behave in scenario given below

1) I have more than one connection in within a transactionscope (Isolation level - ReadCommited),which will bring MS- DTC into action now :

a) Will MS-DTC automatically change isolation level to SERIALIZABLE.

b) (Imp) If above answer is yes and I have implemented Row versioning based isolation level i.e. in addition to TransactionScope, i have also enabled the READ_COMMITTED_SNAPSHOT database option "ON", will it remain in effect means will it support "SERIALIZABLE" isolation level.

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();
    }
}

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

白日梦 2024-08-19 19:42:03

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

更新

1) 是的,MS DTC 将参与其中。

1a) 否(见上文)。

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

Serializable is the default isolation level but MS DTC will respect the Isolation Level you specify in your TransactionOptions.

UPDATE

1) Yes, MS DTC Will be involved.

1a) No (see above).

1b) The previous answer is not yes, but it is my understanding that READ_COMMITTED_SNAPSHOT is only in effect if the isolation level is read committed. Other isolation levels will enforce their own locking model. "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."

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文