TransactionScope超时怪异与TransactionScopeOption.RequiresNew

时间:2009-04-27 10:22:00

标签: c# transactionscope

这里发生了一些奇怪的事情。

我刚刚在我调试的一些遗留代码周围添加了一个事务范围,以确保我正在做的摆弄不会被提交。

这工作了两次,然后说:

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

在工作/非工作之间没有任何代码更改或重建(实际上连续3个F5 [web app])。这是连接到删除数据库服务器的本地代码。

因此,不同项目中完全独立的代码会超时。如果我从这段代码中删除transactionScopes它运行正常,但随着它们到位,它会超时。我已经尝试了我的本地SQL服务器和远程SQL服务器,它们都在transactionScope中超时。

到底是怎么回事?

编辑:我发现更改了我的TransactionScopes:

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

using (var scope = new TransactionScope())

可以解决问题:s

这是什么意思?

3 个答案:

答案 0 :(得分:3)

之间的区别:

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

using (var scope = new TransactionScope())

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

事务中的此事务需要分布式事务处理协调器。

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

  • MSDTC未运行
  • 您的数据库位于不同的计算机上,并且Windows配置为不允许来自网络的事务。
  • 您的数据库位于不同的计算机上,SQL服务器配置为不允许来自网络的事务

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

旧问题,但我遇到了同样的问题,所以这里有解决许多问题的简单信息。

如果您可以从TransactionScopeOption.RequiresNew更改为TransactionScopeOption.Required ,请检查您是否确实需要明确嵌套事务的行为,并考虑通过阅读{显式设置事务范围的类型{3}}。可能你的问题是拥有锁定资源的新交易的数量,这就是为什么这个问题很奇怪"。

此外,您应该查看此信息:

<强> this MSDN article

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

默认设置为:

  1. IsolationLevel as Serializable(考虑使用IsolationLevel.ReadCommitted
  2. TimeOut到一分钟(考虑使用TransactionManager.MaximumTimeout
  3. 使用这两个选项和TransactionScopeOption.RequiresNew,您应该会遇到死锁。

    这里是新代码:

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