这里发生了一些奇怪的事情。
我刚刚在我调试的一些遗留代码周围添加了一个事务范围,以确保我正在做的摆弄不会被提交。
这工作了两次,然后说:
"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
这是什么意思?
答案 0 :(得分:3)
之间的区别:
using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew))
和
using (var scope = new TransactionScope())
是第二个重用现有(环境)事务,而第一个事务是在旧事务中创建新事务。
事务中的此事务需要分布式事务处理协调器。
您的错误有三个可能的原因:
答案 1 :(得分:0)
我相信发生错误时发生的事情是框架正在尝试将原始的“轻量级”(即DBMS)事务提升为“分布式”事务。管理分布式事务的MSDTC(分布式事务处理协调器)服务未运行或无法工作。
当一个逻辑事务跨越两个(或更多)数据库连接时,通常会发生这种情况。当然,在您的情况下(显然)只有一个DBMS连接。我猜通过强制一个新的,独立的事务范围,你也迫使框架使用分布式事务。
答案 2 :(得分:0)
旧问题,但我遇到了同样的问题,所以这里有解决许多问题的简单信息。
如果您可以从TransactionScopeOption.RequiresNew
更改为TransactionScopeOption.Required
,请检查您是否确实需要明确嵌套事务的行为,并考虑通过阅读{显式设置事务范围的类型{3}}。可能你的问题是拥有锁定资源的新交易的数量,这就是为什么这个问题很奇怪"。
此外,您应该查看此信息:
<强> this MSDN article 强>
using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew))
默认设置为:
IsolationLevel.ReadCommitted
)TransactionManager.MaximumTimeout
)使用这两个选项和TransactionScopeOption.RequiresNew
,您应该会遇到死锁。
这里是新代码:
new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadCommitted,
Timeout = TransactionManager.MaximumTimeout
}
)