sql-server – ZombieCheck异常 – 此SqlTransaction已完成;它不再可用 – 在简单提交期间

前端之家收集整理的这篇文章主要介绍了sql-server – ZombieCheck异常 – 此SqlTransaction已完成;它不再可用 – 在简单提交期间前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下代码执行单个行到数据库表的提交(sql 2008 / .NET 4)
  1. using (var db = new MyDbDataContext(_dbConnectionString))
  2. {
  3. Action action = new Action();
  4. db.Actions.InsertOnSubmit(dbAction);
  5. db.SubmitChanges();
  6. }

通常一切都很好,但有一段时间我会得到以下例外:

  1. System.InvalidOperationException: This sqlTransaction has completed; it is no longer usable.
  2. at System.Data.sqlClient.sqlTransaction.ZombieCheck()
  3. at System.Data.sqlClient.sqlTransaction.Rollback()
  4. at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)

在SO上有一些类似的问题,但是在阅读之后,我无法解决问题.

这可能是由于sql超时(在调用完成后接近25秒发生异常)?或者我应该期望在这种情况下的sql超时异常?

有人知道还有什么可能造成这种情况吗?

解决方法

DataContext.SubmitChanges方法在其主体中具有以下代码行:
  1. // ...
  2. try
  3. {
  4. if (this.provider.Connection.State == ConnectionState.Open)
  5. {
  6. this.provider.ClearConnection();
  7. }
  8. if (this.provider.Connection.State == ConnectionState.Closed)
  9. {
  10. this.provider.Connection.Open();
  11. flag = true;
  12. }
  13. dbTransaction = this.provider.Connection.BeginTransaction(IsolationLevel.ReadCommitted);
  14. this.provider.Transaction = dbTransaction;
  15. new ChangeProcessor(this.services,this).SubmitChanges(failureMode);
  16. this.AcceptChanges();
  17. this.provider.ClearConnection();
  18. dbTransaction.Commit();
  19. }
  20. catch
  21. {
  22. if (dbTransaction != null)
  23. {
  24. dbTransaction.Rollback();
  25. }
  26. throw;
  27. }
  28. // ...

当连接超时时,执行catch块,并且dbTransaction.Rollback();行将抛出一个InvalidOperationException.

如果您可以控制代码,可以像下面那样捕获异常:

  1. catch
  2. {
  3. // Attempt to roll back the transaction.
  4. try
  5. {
  6. if (dbTransaction != null)
  7. {
  8. dbTransaction.Rollback();
  9. }
  10. }
  11. catch (Exception ex2)
  12. {
  13. // This catch block will handle any errors that may have occurred
  14. // on the server that would cause the rollback to fail,such as
  15. // a closed connection.
  16. Console.WriteLine("Rollback Exception Type: {0}",ex2.GetType());
  17. Console.WriteLine(" Message: {0}",ex2.Message);
  18. }
  19. throw;
  20. }

猜你在找的MsSQL相关文章