我在应用程序中遇到过一次错误。SQLTransaction已完成错误
此SQLTransaction已完成;它不再可用
堆栈跟踪如下连接 - 它说,大约Zombie Check
和Rollback
。
代码中的错误是什么?
注意:此错误只出现一次。
UPDATE
从MSDN - SqlTransaction.Rollback Method
如果连接被终止,或者如果该事务已经被回滚服务器上的回滚生成一个InvalidOperationException。
从Zombie check on Transaction - Error
一个我看到这个错误出在各种应用了最常见的原因是,共享跨我们的应用程序的SqlConnection。
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);
}
堆栈跟踪
参考:
- What is zombie transaction?
- Zombie check on Transaction - Error
- SqlTransaction has completed
- http://forums.asp.net/t/1579684.aspx/1
- "This SqlTransaction has completed; it is no longer usable."... configuration error?
- dotnet.sys-con.com - SqlClient Connection Pooling Exposed
- Thread abort leaves zombie transactions and broken SqlConnection
什么是导致您的代码达到'catch'的异常? – Maarten 2013-03-08 12:13:09
在这种情况下,您应该为您的交易使用“使用”声明。请参阅http://stackoverflow.com/questions/1127830/why-use-a-using-statement-with-a-sqltransaction – Maarten 2013-03-08 12:14:07
@Maarten公平,OP *确保*确保它被丢弃;但我同意*不*使用'使用'使得它过于复杂 – 2013-03-08 12:15:13