我的应用程序曾经出现过以下错误:
此 SQLTransaction 已完成;它不再可用
下面附上堆栈跟踪 - 它提到了 Zombie Check
和 Rollback
。
代码中的错误是什么?
注意:这个错误只出现了一次。
更新
来自MSDN - SqlTransaction.Rollback Method
如果连接已终止或事务在服务器上已回滚,则回滚会生成 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
- "This SqlTransaction has completed; it is no longer usable."... 配置错误?
- dotnet.sys-con.com - SqlClient 连接池揭秘
- 线程中止会导致僵尸事务和破损的 SqlConnection
using
使其过于复杂。 - Marc Gravell