【问题标题】:Determine what is causing the error "This SqlTransaction has completed; it is no longer usable" error确定导致错误“此 SqlTransaction 已完成;它不再可用”错误的原因
【发布时间】:2014-04-09 11:37:26
【问题描述】:

我们运行在 ASP.NET 中创建的基于 Web 的专有财务系统,该系统定期抛出以下错误:-

Exception: System.InvalidOperationException

Message: This SqlTransaction has completed; it is no longer usable.

StackTrace:    at System.Data.SqlClient.SqlTransaction.ZombieCheck()
   at System.Data.SqlClient.SqlTransaction.Rollback()
   at Agresso.Driver.Database.ManagedConnection.RollbackTransaction()
   at Agresso.Driver.Database.ManagedConnection.Close()
   at Agresso.Driver.Database.ManagedConnection.Dispose(Boolean isDisposing)
   at Agresso.Driver.Database.ManagedDatabase.Dispose(Boolean isDisposing)
   at Agresso.Driver.Database.DatabaseBase.Finalize()

已向供应商记录该问题,但他们认为该错误是由于我们自己创建的定制工作造成的。

您会推荐什么方法来确定导致系统进入此状态的原因?我们无权调试应用程序,但可以在数据库上运行分析器。然而到目前为止,这并没有为导致问题的原因提供任何可能的线索。

我们目前只是重新启动应用程序池,这样可以解决问题一段时间,然后再再次发生。

非常感谢。

【问题讨论】:

    标签: asp.net sql sql-server transactions runtime-error


    【解决方案1】:

    纯属猜测,但是:

    • 如果 DatabaseBase.Finalize() 是一个 .NET 终结器,它不应该尝试释放托管资源 - 所以这很可能是 DatabaseBase 类终结器中的一个错误。

      李>
    • 然而,IDisposable 类的终结器通常仅在调用者未能Dispose 类的实例时才被调用(Dispose 方法通常调用 GC.SuppressFinalize 以阻止终结器运行)。

    我将首先查看您自己的访问数据库的代码,并确保您为所有 IDisposable 类型调用 Dispose,通常通过包装在 using 块中。 FxCop / Visual Studio 代码分析可以帮助您识别代码中您未能做到这一点的地方。

    这可以很好地解决问题。如果没有,我建议您尝试为该问题创建一个最小的重现并再次联系供应商。

    【讨论】:

      猜你喜欢
      • 2011-09-15
      • 2014-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多