J'ai ce code, exécuté parallèlement dans deux threads distincts. Cela fonctionne correctement pour quelques fois, mais à un certain point aléatoire, il lève InvalidOperationException:InvalidOperationException lors de l'exécution de SqlCommand avec la transaction
La transaction n'est pas associée à la connexion en cours ou a été terminée.
Au point d'exception, je regarde dans la transaction avec Visual Studio et vérifie que sa connexion est réglée normalement. Aussi command.Transaction._internalTransaction. _transactionState est défini sur Active et la propriété IsZombied sur false.
Ceci est une application de test et j'utilise Thread.Sleep pour créer des transactions plus longues et provoquer des chevauchements.
Pourquoi l'exception peut-elle être levée et que puis-je faire?
IDbCommand command = new SqlCommand("Select * From INFO");
IDbConnection connection = new SqlConnection(connectionString);
command.Connection = connection;
IDbTransaction transaction = null;
try
{
connection.Open();
transaction = connection.BeginTransaction();
command.Transaction = transaction;
command.ExecuteNonQuery(); // Sometimes throws exception
Thread.Sleep(forawhile); // For overlapping transactions running in parallel
transaction.Commit();
}
catch (ApplicationException exception)
{
if (transaction != null)
{
transaction.Rollback();
}
}
finally
{
connection.Close();
}