23

只是好奇是否有其他人遇到此特定错误并知道如何解决?

场景如下...

我们有一个 ASP.NET Web 应用程序,它使用在连接到 SQL Server 2008 集群后端的 Windows Server 2008 IIS 场上运行的企业库。MSDTC 已打开。数据库连接是池化的。

我的怀疑是,沿线某处发生了失败的 MSDTC 事务,连接返回到池中,并且不同页面上的下一个查询正在拾取行为不端的连接并得到这个特定的错误。有趣的是,我们在一个不需要分布式事务(提交到两个数据库等)的查询中遇到了这个错误。当我们得到错误时,我们只做选择查询(无事务)。

我们进行了 SQL Profiling,查询在 SQL Server 上运行,但从未返回(因为 MSDTC 事务已在连接中中止)。

伴随此的其他一些相关错误是:

  • 不允许启动新请求,因为它应该带有有效的事务描述符。
  • 内部 .Net Framework 数据提供程序错误 60。
4

4 回答 4

6

MSDTC 有默认的 90 秒超时,如果一个查询执行超过这个时间限制,当事务试图提交时你会遇到这个错误。

于 2010-08-20T05:14:57.717 回答
3

赏金可能有助于获得您寻求的答案,但如果您提供一些代码示例并更好地描述错误发生的时间,您可能会得到更好的答案。

错误只是间歇性发生吗?从你的描述看是这样的。

using TransactionScope您是否按照 Microsoft 的建议将您希望作为交易完成的关闭包含在一个块中?这应该有助于避免奇怪的交易行为。回想一下,using无论抛出什么异常,块都确保始终释放对象。请参阅此处:http: //msdn.microsoft.com/en-us/library/ms172152.aspx

如果您使用TransactionScope的是一个参数System.TransactionScopeOption.RequiresNew,它告诉框架始终为此代码块创建一个新事务:

    Using ts As New Transactions.TransactionScope(Transactions.TransactionScopeOption.RequiresNew)
        ' Do Stuff
    End Using

此外,如果您怀疑连接出现故障然后放回连接池,则可能的解决方案是将可能导致连接故障的代码包含在 Try-Catch 块中,Dispose并将连接放在 catch 块中。

于 2010-07-22T20:54:02.817 回答
1

老问题......但在过去几天遇到了这个问题。

直到现在都找不到好的答案。只是想分享我发现的东西。

我的场景包含由多个会话工厂打开的多个会话。我必须正确回滚并等待并确保其他事务不再处于活动状态。似乎只回滚其中一个就会回滚所有内容。

但是在回滚之间添加 Thread.Sleep() 之后,它不会做另一个并继续回滚。触发该方法的后续命中不会导致“不允许启动新请求,因为它应该带有有效的事务描述符。” 错误。

https://gist.github.com/josephvano/5766488

于 2013-06-12T19:35:39.643 回答
0

我以前见过这个,原因正是你的想法。正如 Rice 建议的那样,确保您正确处理了与 db 相关的对象以避免此问题。

于 2010-07-23T18:09:23.713 回答