SQLTransaction已完成错误

我在应用程序中遇到过一次错误。

此SQLTransaction已完成; 它不再可用

堆栈跟踪附在下面 - 它说关于Zombie CheckRollback

代码中的错误是什么?

注意:此错误只出现一次。

UPDATE

从MSDN - SqlTransaction.Rollback方法

如果连接终止或者事务已在服务器上回滚,则回滚会生成InvalidOperationException。

从僵尸检查交易 - 错误

我发现在各种应用程序中出现此错误的最常见原因之一是,在我们的应用程序中共享 SqlConnection。

public int SaveUserLogOnInfo(int empID)
{
        int? sessionID = null;
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            SqlTransaction transaction = null;
            try
            {
                transaction = connection.BeginTransaction();
                sessionID = GetSessionIDForAssociate(connection, empID, transaction);

                    //Other Code

                //Commit
                transaction.Commit();
            }
            catch
            {
                //Rollback
                if (transaction != null)
                {
                    transaction.Rollback();
                    transaction.Dispose();
                    transaction = null;
                }

                //Throw exception
                throw;
            }
            finally
            {
                if (transaction != null)
                {
                    transaction.Dispose();
                }
            }
        }

        return Convert.ToInt32(sessionID,CultureInfo.InvariantCulture);

   }

堆栈跟踪

在这里输入图像描述


参考

  • 什么是僵尸交易?
  • 僵尸检查交易 - 错误
  • SqlTransaction已完成
  • http://forums.asp.net/t/1579684.aspx/1
  • “这个SqlTransaction已经完成,它不再可用。”...配置错误?
  • dotnet.sys-con.com - SqlClient连接池暴露
  • 线程中止离开僵尸事务并破坏SqlConnection


  • 你应该把一些工作留给编译器,把它封装在try / catch / finally中。

    此外,如果在Commit阶段出现问题,或者与服务器的连接断开,您应该期望Rollback偶尔会引发异常。 出于这个原因,你应该把它包装在try / catch

    try
    {
        transaction.Rollback();
    }
    catch (Exception ex2)
    {
        // This catch block will handle any errors that may have occurred 
        // on the server that would cause the rollback to fail, such as 
        // a closed connection.
        Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
        Console.WriteLine("  Message: {0}", ex2.Message);
    }
    

    这完全是从MSDN文档页面为Rollback方法复制的。

    我看到你担心你有僵尸交易。 如果你粘贴,这听起来不像你有问题。 你的交易已经完成,你不应该再与它有任何关系。 如果你拿着它们,请删除它的引用,并忘记它。


    从MSDN - SqlTransaction.Rollback方法

    如果连接终止或者事务已在服务器上回滚,则回滚会生成InvalidOperationException。

    重新引发新的例外情况,告诉用户数据可能尚未保存,并要求她刷新和检查


    注意:此错误只出现一次。

    那么很难说很多; 它可能只是简单地说// Other Code等等花了很长时间,整个事情都被杀死了。 也许你的联系死了,或者管理员故意杀死它,因为你被阻止了。

    代码中的错误是什么?

    过度复杂化; 它可以更简单:

    using (var connection = new SqlConnection(connectionString))
    {
        connection.Open();
        using(var transaction = connection.BeginTransaction())
        {
            try
            {
                sessionID = GetSessionIDForAssociate(connection, empID, transaction);
                //Other Code
                transaction.Commit();
             }
             catch
             {
                transaction.Rollback();
                throw;
             }
        }
    }
    

    更少的代码出错。


    我曾经遇到过这个错误,而且我被卡住了,无法知道发生了什么问题。 其实我正在删除一个记录,并在存储过程中,我没有删除它的孩子,特别是Stored Procedure的删除语句是在Transaction边界内。 我从存储过程中删除了该事务代码,并摆脱了获取此“This SqlTransaction has completed; it is no longer usable.”错误“This SqlTransaction has completed; it is no longer usable.” “This SqlTransaction has completed; it is no longer usable.”

    链接地址: http://www.djcxy.com/p/20367.html

    上一篇: SQLTransaction has completed error

    下一篇: Is SqlConnection / SqlCommand thread safe?