我在我的应用程序中遇到了一次以下错误。
此 SQLTransaction 已完成;它不再可用
堆栈跟踪附在下面——它说关于Zombie Check
和Rollback
。
代码中的错误是什么?
注意:此错误仅出现一次。
更新
来自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