3

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

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

这工作了两次,然后说:

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

在工作/非工作之间没有任何代码更改或重建(字面意思是连续 3 个 F5 [网络应用程序])。这是连接到删除数据库服务器的本地代码。

因此,不同项目中完全独立的代码会超时。如果我从此代码中删除 transactionScopes,它运行良好,但在它们到位时它会超时。我已经尝试过我的本地 SQL 服务器和远程服务器,它们都在事务范围内超时。

这到底是怎么回事?

编辑:我发现将我的 TransactionScopes 更改为:

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

using (var scope = new TransactionScope())

防止问题:s

这是什么意思?

4

3 回答 3

3

和...之间的不同:

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

using (var scope = new TransactionScope())

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

事务中的这个事务需要分布式事务协调器。

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

  • MSDTC 未运行
  • 您的数据库位于另一台计算机上,并且 Windows 配置为不允许来自网络的事务。
  • 您的数据库位于另一台计算机上,并且 SQL 服务器配置为不允许来自网络的事务
于 2009-09-03T14:37:13.277 回答
0

我相信当错误发生时,框架正试图将原来的“轻量级”(即 DBMS)事务提升为“分布式”事务。管理分布式事务的 MSDTC(分布式事务协调器)服务要么未运行,要么无法工作。

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

于 2009-04-27T12:18:05.083 回答
0

老问题,但我有同样的问题,所以这里有简单的信息来解决许多问题。

如果您可以更改 fromTransactionScopeOption.RequiresNewTransactionScopeOption.Required 检查您是否真的需要显式嵌套事务的行为并考虑通过阅读此 MSDN 文章显式设置事务范围的类型。可能您的问题是具有锁定资源的新事务的数量,这就是问题“奇怪”的原因。

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

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

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

默认情况下,您设置:

  1. IsolationLevel as Serializable(考虑使用IsolationLevel.ReadCommitted
  2. TimeOut 到一分钟(考虑使用TransactionManager.MaximumTimeout

使用这两个选项,TransactionScopeOption.RequiresNew您应该会遇到死锁。

这里是新代码:

new TransactionScope(TransactionScopeOption.Required, 
    new TransactionOptions 
    {
        IsolationLevel = IsolationLevel.ReadCommitted,
        Timeout = TransactionManager.MaximumTimeout
    }
)
于 2015-06-01T17:24:18.050 回答