TransactionScopeOption.RequiresNew下的TransactionScope超时问题奇怪性

3

这里发生了非常奇怪的事情。

我在调试一些旧代码时,添加了一个事务范围,以确保我所做的更改不会被提交。

这个方法起初运行正常两次,然后出现了以下错误:

"The transaction manager has disabled its support for remote/network transactions."

不需要任何代码更改或重建就可以在工作/不工作之间切换(字面上是连续3次按F5 [Web应用程序])。这是本地代码连接到远程DB服务器。

自此以后,完全分离的不同项目中的代码会超时。如果我从此代码中删除transactionScopes,它就可以正常运行,但是如果将其放置在其中,它就会超时。我尝试过我的本地SQL服务器和远程服务器,两者都在transactionScope内超时。

到底出了什么问题?

编辑:我发现将TransactionScopes从以下内容更改为:

using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew))

to

using (var scope = new TransactionScope())

防止问题的发生 :s

这是什么意思?


请问您能否展示一下代码? - Mitch Wheat
不容易,我正在努力创建一个简单的示例来复现它。请继续关注。 - Andrew Bullock
3个回答

3

以下是“差异”之间的区别:

using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew))

并且

using (var scope = new TransactionScope())

第二个重用现有的(环境)事务,而第一个在旧事务中创建一个新事务。

这个嵌套事务需要分布式事务协调器。

那么,您的错误可能有三个原因:

  • MSDTC未运行
  • 您的数据库位于另一台机器上,而Windows配置不允许从网络进行事务。
  • 您的数据库位于另一台机器上,而SQL服务器配置不允许从网络进行事务。

1
指出“new TransactionScope()”等价于“new TransactionScope(TransactionScopeOption.Required)”,实际上这一点很重要。 - Yoopergeek

0

虽然这是一个老问题,但我也遇到了同样的问题,所以在这里提供一些简单的信息来解决各种问题。

如果你可以从TransactionScopeOption.RequiresNew更改为TransactionScopeOption.Required,请检查是否真的需要显式地指定嵌套事务的行为,并考虑通过阅读此MSDN文章来明确设置事务范围的类型。可能你的问题是有太多的新事务锁定了资源,这就是为什么问题看起来很“奇怪”的原因。

此外,你还应该检查以下信息:

默认的事务范围被认为是有害的

using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew))

默认情况下,您设置为:

  1. 将IsolationLevel设置为Serializable(考虑使用IsolationLevel.ReadCommitted
  2. 将TimeOut设置为一分钟(考虑使用TransactionManager.MaximumTimeout

有了这两个选项和TransactionScopeOption.RequiresNew,您应该预期会出现死锁。

以下是新代码:

new TransactionScope(TransactionScopeOption.Required, 
    new TransactionOptions 
    {
        IsolationLevel = IsolationLevel.ReadCommitted,
        Timeout = TransactionManager.MaximumTimeout
    }
)

0

我认为错误发生时的情况是框架试图将原始的“轻量级”(即DBMS)事务提升为“分布式”事务。管理分布式事务的MSDTC(分布式事务协调器)服务未运行或无法工作。

这通常发生在一个逻辑事务跨越两个(或多个)数据库连接时。当然,在您的情况下,显然只有一个DBMS连接。我猜测通过强制使用新的、独立的事务范围,您也在强制框架使用分布式事务。


这位用户遇到了非常类似的问题,如果这能再提供一些线索:http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.adonet/topic62511.aspx - Andrew Bullock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接