分布式事务已完成。要么将此会话加入新事务,要么加入 NULL 事务。

24

好奇是否还有其他人遇到了这个特定的错误,并知道如何解决?

情景如下...

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

我怀疑在某个地方出现了失败的MSDTC事务,连接被返回到池中,不同页面上的下一个查询正在拾取表现不良的连接并导致了此特定错误。有趣的是,我们在执行与分布式事务(提交到两个数据库等)毫不相干的查询时遇到了这个错误(没有事务)。

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

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

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

你有关于这个找到了什么信息吗?我在插入大于10K行的数据集时出现了问题。 - StingyJack
4个回答

6

MSDTC默认的超时时间是90秒,如果一个查询执行超过这个时间限制,当事务尝试提交时,您将遇到此错误。


这就是我的全部!(不确定为什么会有人踩它。) - Vaccano

4

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

根据您的描述,错误是否仅偶尔发生?听起来是这样的。

您是否按照Microsoft的建议在using TransactionScope块中封闭要执行的关闭操作作为事务?这应该有助于避免奇怪的事务行为。请记住,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 块中,并在 catch 块中Dispose该连接。

只是为了澄清,我被告知您只想在连接进入故障状态时处理SQL连接;否则,您将无法池化这些连接。 - Vivian River

1

老问题...但最近几天遇到了这个问题。

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

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

但在回滚之间添加Thread.Sleep()后,它不会执行其他操作,并继续进行回滚。触发该方法的后续命中不会导致“新请求无法启动,因为它应该带有有效的事务描述符。”错误。

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


0

我以前见过这种情况,原因正是你所想的。如Rice所建议的那样,请确保您正确处理与数据库相关的对象,以避免这种问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接