Ho ricevuto l'errore successivo una volta nella mia applicazione.SQLTransaction ha completato l'errore
Questo SQLTransaction è stato completato; essa non è più utilizzabile
Stack Trace è fissato al di sotto - Si dice di Zombie Check
e Rollback
.
Qual è l'errore nel codice?
Nota: questo errore è venuto solo una volta.
UPDATE
Da MSDN - SqlTransaction.Rollback Method
un rollback genera un'InvalidOperationException se la connessione viene terminata o se la transazione è già stato rotolato indietro sul server.
Da Zombie check on Transaction - Error
Uno dei motivi più frequenti che ho visto questo errore mostrando in varie applicazioni è, condivisione SqlConnection attraverso la nostra applicazione.
CODICE
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
RIFERIMENTO:
- 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
Qual è l'eccezione che causa il codice per raggiungere il 'catch'? – Maarten
In questo caso è necessario utilizzare un'istruzione "using" per la transazione. Vedi http://stackoverflow.com/questions/1127830/why-use-a-using-statement-with-a-sqltransaction – Maarten
@Maarten per essere onesti, l'OP * fa * assicurarsi che venga smaltito; ma sono d'accordo che * non * usando 'using' lo rende troppo complesso –