SQLTransaction已完成错误
我在应用程序中遇到过一次错误。
此SQLTransaction已完成; 它不再可用
堆栈跟踪附在下面 - 它说关于Zombie Check
和Rollback
。
代码中的错误是什么?
注意:此错误只出现一次。
UPDATE
从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);
}
堆栈跟踪
参考 :
你应该把一些工作留给编译器,把它封装在try
/ catch
/ finally
中。
此外,如果在Commit
阶段出现问题,或者与服务器的连接断开,您应该期望Rollback
偶尔会引发异常。 出于这个原因,你应该把它包装在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);
}
这完全是从MSDN文档页面为Rollback方法复制的。
我看到你担心你有僵尸交易。 如果你粘贴,这听起来不像你有问题。 你的交易已经完成,你不应该再与它有任何关系。 如果你拿着它们,请删除它的引用,并忘记它。
从MSDN - SqlTransaction.Rollback方法
如果连接终止或者事务已在服务器上回滚,则回滚会生成InvalidOperationException。
重新引发新的例外情况,告诉用户数据可能尚未保存,并要求她刷新和检查
注意:此错误只出现一次。
那么很难说很多; 它可能只是简单地说// Other Code
等等花了很长时间,整个事情都被杀死了。 也许你的联系死了,或者管理员故意杀死它,因为你被阻止了。
代码中的错误是什么?
过度复杂化; 它可以更简单:
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
using(var transaction = connection.BeginTransaction())
{
try
{
sessionID = GetSessionIDForAssociate(connection, empID, transaction);
//Other Code
transaction.Commit();
}
catch
{
transaction.Rollback();
throw;
}
}
}
更少的代码出错。
我曾经遇到过这个错误,而且我被卡住了,无法知道发生了什么问题。 其实我正在删除一个记录,并在存储过程中,我没有删除它的孩子,特别是Stored Procedure
的删除语句是在Transaction
边界内。 我从存储过程中删除了该事务代码,并摆脱了获取此“This SqlTransaction has completed; it is no longer usable.”
错误“This SqlTransaction has completed; it is no longer usable.”
“This SqlTransaction has completed; it is no longer usable.”