我在我的应用程序一次以下错误。
本的SqlTransaction已完成;它不再可用
堆栈跟踪附在下面 - 它说,约僵尸检查
和还原
。
什么是在code中的错误?
注:此错误只来一次,
更新
从 MSDN - SqlTransaction.Rollback方法
回滚生成一个InvalidOperationException如果连接被终止,或者如果事务已回滚在服务器上。
从僵尸检查的事务 - 错误
其中,最常见的原因,我已经看到了这个错误出在各种应用起来就是,共享的SqlConnection在我们的应用程序。
code
公众诠释SaveUserLogOnInfo(INT EMPID)
{
诠释?会话ID = NULL;
使用(SqlConnection的连接=新的SqlConnection(的connectionString))
{
connection.Open();
的SqlTransaction事务= NULL;
尝试
{
交易= connection.BeginTransaction();
会话ID = GetSessionIDForAssociate(连接,EMPID,交易);
//其他code
//承诺
器transaction.commit();
}
抓住
{
//回滚
如果(交易!= NULL)
{
transaction.Rollback();
transaction.Dispose();
交易= NULL;
}
//抛出异常
扔;
}
最后
{
如果(交易!= NULL)
{
transaction.Dispose();
}
}
}
返回Convert.ToInt32(会话ID,CultureInfo.InvariantCulture);
}
堆栈跟踪
参考
什么是僵尸交易? 上交易僵尸检查 - 错误 的SqlTransaction已完成 http://forums.asp.net/t/1579684.aspx/1 "This的SqlTransaction已完成;它不再可用"?...配置错误 dotnet.sys-con.com - SqlClient连接池暴露 Thread中止叶僵尸交易和破碎的SqlConnection 解决方案您应该留下一些工作,编译器,包裹在一个尝试
/ 抓
/ 最后
给你。
此外,你应该预料到还原
偶尔会抛出一个异常,如果出现问题提交
的阶段,或者,如果服务器断开连接。出于这个原因,你应该把它包在尝试
/ 抓
。
尝试
{
transaction.Rollback();
}
赶上(例外EX2)
{
//这个catch块来处理可能发生的任何错误
//服务器,将导致回滚失败,例如上
//关闭的连接。
Console.WriteLine(回滚异常类型:{0},ex2.GetType());
Console.WriteLine(消息:{0},ex2.Message);
}
这是完全从回滚方法 MSDN文档页面复制。
我看你是担心你有一个僵尸交易。如果你粘贴的,它听起来并不像你有问题。你是交易已经完成了,你不应该再有什么关系呢。删除引用它,如果你抱着他们,忘掉它。
从 MSDN - SqlTransaction.Rollback方法
回滚生成一个InvalidOperationException如果连接被终止,或者如果事务已回滚在服务器上。
重新抛出一个新的异常,告诉用户该数据可能还没有被保存,并要求她刷新和审查
I got following error once in my application.
This SQLTransaction has completed; it is no longer usable
Stack Trace is attached below – It says about Zombie Check
and Rollback
.
What is the mistake in the code?
Note: This error came only once.
UPDATE
From MSDN - SqlTransaction.Rollback Method
A Rollback generates an InvalidOperationException if the connection is terminated or if the transaction has already been rolled back on the server.
From Zombie check on Transaction - Error
One of the most frequent reasons I have seen this error showing up in various applications is, sharing SqlConnection across our application.
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);
}
Stack Trace
REFERENCE:
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解决方案
You should leave some of the work to compiler, to wrap that in a try
/catch
/finally
for you.
Also, you should expect that Rollback
can occasionally throw an exception, if a problem occurs in Commit
stage, or if a connection to server breaks. For that reason you should wrap it in a 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);
}
This is copied exactly from MSDN documentation page for Rollback method.
I see that you're worried that you have a zombie transaction. In case you pasted, it doesn't sound like you have a problem. You're transaction has been completed, and you should no longer have anything to do with it. Remove references to it if you hold them, and forget about it.
From MSDN - SqlTransaction.Rollback Method
A Rollback generates an InvalidOperationException if the connection is terminated or if the transaction has already been rolled back on the server.
Rethrow a new exception to tell user that data may not have been saved, and ask her to refresh and review
相关推荐
最新文章