【发布时间】:2013-03-08 12:07:41
【问题描述】:
我在我的应用程序中遇到了一次以下错误。
此 SQLTransaction 已完成;已经不能用了
堆栈跟踪附在下面——它说的是Zombie Check 和Rollback。
代码有什么错误?
注意:这个错误只出现过一次。
更新
来自MSDN - SqlTransaction.Rollback Method
如果连接终止或事务已在服务器上回滚,则回滚会生成 InvalidOperationException。
来自Zombie check on Transaction - Error
我在各种应用程序中看到此错误的最常见原因之一是,在我们的应用程序中共享 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);
}
堆栈跟踪
参考:
- 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”的异常是什么?
-
在这种情况下,您应该为您的交易使用“使用”语句。见stackoverflow.com/questions/1127830/…
-
@Maarten 公平地说,OP 确实 确保它得到处理;但我同意 not 使用
using会使其过于复杂
标签: c# .net ado.net transactionscope