分布式事务完成.在新事务或NULL事务中登记此会话

Jim*_*dra 23 sql asp.net msdtc transactions transactionscope

只是好奇是否有其他人有这个特殊的错误,知道如何解决它?

情景如下......

我们有一个ASP.NET Web应用程序,使用在Windows Server 2008 IIS场上运行的Enterprise Library连接到SQL Server 2008群集后端.MSDTC已开启.数据库连接汇集在一起​​.

我怀疑是在某个地方有一个失败的MSDTC事务,连接被返回到池中,而另一个页面上的下一个查询正在拾取行为不当的连接并得到了这个特殊的错误.有趣的是,我们在一个不需要分布式事务(提交到两个数据库等)的查询中得到了这个错误.当我们收到错误时,我们只做了选择查询(没有事务).

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

其他一些相关的错误是:

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

Rus*_*ang 6

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


Dan*_*don 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
Run Code Online (Sandbox Code Playgroud)

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