2

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(); 
} 

Répondre

2

Trouvé la solution. Il s'avère que l'appel de cela

command.Connection = connection; 

ne signifie pas que vous définissez la connexion à la commande. Juste après avoir appelé cela, j'ai vérifié les résultats de

command.Connection.GetHashCode(); 
command.GetHashCode(); 

et ils n'étaient pas égaux. Refusé le code pour utiliser connection.CreateCommand et le problème résolu.

Questions connexes