2009-04-27 86 views
3

超奇怪的事情在这里发生。TransactionScope超时奇怪与TransactionScopeOption.RequiresNew

我只是增加了一个交易范围周围的一些遗留代码,我调试,以确保我做不会得到犯下的摆弄。

这个工作两次,然后说:

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

无需更改任何代码或工作/ nonworkingness之间重建(字面3个F5s连续[web应用程序])。这是连接到删除数据库服务器的本地代码。

由于这,在一个不同的项目完全独立的码超时。如果我从这段代码中删除了transactionScopes,它运行良好,但是在它们到位的情况下它会超时。我试过我的本地SQL服务器和远程服务器,都在transactionScope中超时。

这到底是怎么回事?

编辑:我发现,从改变我的TransactionScopes:

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

using (var scope = new TransactionScope()) 

防止问题:■

这是什么意思?

+0

你能告诉我们的代码,请... – 2009-04-27 10:43:03

+0

不容易,我尝试创建一个简单的例子来复制它。敬请关注 – 2009-04-27 10:52:48

回答

0

我相信,当发生错误是该框架正试图推动原有的“轻量级”(即DBMS)交易的“分布式”的交易发生了什么。管理分布式事务的MSDTC(分布式事务协调器)服务未运行或无法工作。

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

+0

这个家伙有一个非常类似的问题,如果这个棚子更多的光http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.adonet/topic62511.aspx – 2009-04-27 12:28:14

3

之间的差异:

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

using (var scope = new TransactionScope()) 

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

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

有那么你的错误三分可能的理由:

  • 的MSDTC不运行
  • 你的数据库是在不同的机器上和窗户被配置为不允许从网络交易。
  • 你的数据库是在不同的机器上,并且SQL服务器配置为不允许从网络
0

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

如果,如果你真的需要明确对嵌套事务的行为,并考虑通过阅读this MSDN article设定明确的那种交易范围,可以改变从TransactionScopeOption.RequiresNewTransactionScopeOption.Required检查。可能你的问题是具有锁定资源的新交易的数量,这就是为什么这个问题是“怪异的”。

另外,你应该检查这个信息:

The default transaction scope is considered harmful

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

默认设置:

  1. 的IsolationLevel为Serializable(考虑使用IsolationLevel.ReadCommitted
  2. 超时一个分钟(考虑使用TransactionManager.MaximumTimeout

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

这里的新代码:

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