我在應用程序中遇到過一次錯誤。SQLTransaction已完成錯誤
此SQLTransaction已完成;它不再可用
堆棧跟蹤如下連接 - 它說,大約Zombie Check
和Rollback
。
代碼中的錯誤是什麼?
注意:此錯誤只出現一次。
UPDATE
從MSDN - SqlTransaction.Rollback Method
如果連接被終止,或者如果該事務已經被回滾服務器上的回滾生成一個InvalidOperationException。
從Zombie check on Transaction - Error
一個我看到這個錯誤出在各種應用了最常見的原因是,共享跨我們的應用程序的SqlConnection。
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);
}
堆棧跟蹤
參考:
- 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'的異常? – Maarten 2013-03-08 12:13:09
在這種情況下,您應該爲您的交易使用「使用」聲明。請參閱http://stackoverflow.com/questions/1127830/why-use-a-using-statement-with-a-sqltransaction – Maarten 2013-03-08 12:14:07
@Maarten公平,OP *確保*確保它被丟棄;但我同意*不*使用'使用'使得它過於複雜 – 2013-03-08 12:15:13