且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

的SqlTransaction已完成错误

更新时间:2023-12-05 11:02:10

您应该留下一些工作,编译器,包裹在一个尝试 / / 最后给你。

此外,你应该预料到还原偶尔会抛出一个异常,如果出现问题提交的阶段,或者,如果服务器断开连接。出于这个原因,你应该把它包在尝试 /

 尝试
{
    transaction.Rollback();
}
赶上(例外EX2)
{
    //这个catch块来处理可能发生的任何错误
    //服务器,将导致回滚失败,例如上
    //关闭的连接。
    Console.WriteLine(回滚异常类型:{0},ex2.GetType());
    Console.WriteLine(消息:{0},ex2.Message);
}
 

这是完全从回滚方法 MSDN文档页面复制。

我看你是担心你有一个僵尸交易。如果你粘贴的,它听起来并不像你有问题。你是交易已经完成了,你不应该再有什​​么关系呢。删除引用它,如果你抱着他们,忘掉它。


MSDN - SqlTransaction.Rollback方法

  

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

重新抛出一个新的异常,告诉用户该数据可能还没有被保存,并要求她刷新和审查

I got following error once in my application.

This SQLTransaction has completed; it is no longer usable

Stack Trace is attached below – It says about Zombie Check and Rollback.

What is the mistake in the code?

Note: This error came only once.

UPDATE

From MSDN - SqlTransaction.Rollback Method

A Rollback generates an InvalidOperationException if the connection is terminated or if the transaction has already been rolled back on the server.

From Zombie check on Transaction - Error

One of the most frequent reasons I have seen this error showing up in various applications is, sharing SqlConnection across our application.

CODE

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);

   }

Stack Trace


REFERENCE:

  1. What is zombie transaction?
  2. Zombie check on Transaction - Error
  3. SqlTransaction has completed
  4. http://forums.asp.net/t/1579684.aspx/1
  5. "This SqlTransaction has completed; it is no longer usable."... configuration error?
  6. dotnet.sys-con.com - SqlClient Connection Pooling Exposed
  7. Thread abort leaves zombie transactions and broken SqlConnection


You should leave some of the work to compiler, to wrap that in a try/catch/finally for you.

Also, you should expect that Rollback can occasionally throw an exception, if a problem occurs in Commit stage, or if a connection to server breaks. For that reason you should wrap it in a 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);
}

This is copied exactly from MSDN documentation page for Rollback method.

I see that you're worried that you have a zombie transaction. In case you pasted, it doesn't sound like you have a problem. You're transaction has been completed, and you should no longer have anything to do with it. Remove references to it if you hold them, and forget about it.


From MSDN - SqlTransaction.Rollback Method

A Rollback generates an InvalidOperationException if the connection is terminated or if the transaction has already been rolled back on the server.

Rethrow a new exception to tell user that data may not have been saved, and ask her to refresh and review