88 votes

Erreur - La transaction associée à la connexion actuelle est terminée mais n'a pas été éliminée.

J'ai eu des difficultés à utiliser le TransactionScope Pour regrouper plusieurs requêtes de base de données dans une transaction, j'utilise SqlBulkCopy avec une taille de lot de 500. Lorsque j'ai augmenté la taille du lot à 1000, j'ai obtenu l'erreur suivante :

La transaction associée à la connexion actuelle est terminée mais n'a pas été éliminée. La transaction doit être éliminée avant que la connexion puisse être utilisée pour exécuter des instructions SQL.

Voici le code que j'utilise :

using (var scope = new TransactionScope())
{
    using (var connection = (SqlConnection)customerTable.OpenConnection())
    {
        var table1BulkCopy = new SqlBulkCopy(connection)
        {
            BatchSize = BATCH_SIZE,
            DestinationTableName = TableName1
        };

        table1BulkCopy.WriteToServer(table1DataTable);

        var table2BulkCopy = new SqlBulkCopy(connection)
        {
            BatchSize = BATCH_SIZE,
            DestinationTableName = TableName2
        };

        table2BulkCopy.WriteToServer(table2DataTable);

        var table3BulkCopy = new SqlBulkCopy(connection)
        {
            BatchSize = BATCH_SIZE,
            DestinationTableName = TableName3
        };

        table1BulkCopy.WriteToServer(table3DataTable);

        var table4BulkCopy = new SqlBulkCopy(connection)
        {
            BatchSize = BATCH_SIZE,
            DestinationTableName = TableName4
        };

        table4BulkCopy.WriteToServer(table4DataTable);

        scope.Complete();
    }
}

-2voto

Sourcephy Points 103

Version C# 9 Lang. TransactionScopeOption.Suppress fonctionne comme par magie pour moi.

// TransactionScopeOption.Suppress works and fixed my issue
using TransactionScope Scope = new TransactionScope(TransactionScopeOption.Suppress);
try
{
    using var CentralConnection = SQLConnection("Other connection string here");
    using var LocalConnection = SQLConnection("Other connection string here");

    // Central
    using var cmd0 = new SqlCommand("OtherSQLCommandTextHere", CentralConnection)
    {
         CommandTimeout = 0 // I just add zero timeout here
    };
    cmd0.ExecuteNonQuery();

    // Local
    using var cmd1 = new SqlCommand("OtherSQLCommandTextHere", LocalConnection)
    {
         CommandTimeout = 0 // I just add zero timeout here
    };
    cmd1.ExecuteNonQuery();

    // The Complete method commits the transaction. If an exception has been thrown,
    // Complete is not called and the transaction is rolled back.
    Scope.Complete();
}
catch (Exception ex)
{
    Scope.Dispose();
    MessageBox.Show(ex.ToString());
}

public SqlConnection SQLConnection(string ISQLConnection)
{
     SqlConnection conn = null;
     try
     {
         conn = new SqlConnection(ISQLConnection);
         conn.Open();            
     }
     catch 
     {
         // skipping here error message
     }
     return conn;
 }

3 votes

J'espère que vous êtes pleinement conscient de ce que TransactionScopeOption.Suppress Le gouvernement ne le fait pas, parce qu'il n'est pas sans conséquences.

0 votes

@PhilipBorgström pouvez-vous nous expliquer ?

1 votes

"Le contexte de la transaction ambiante est supprimé lors de la création du champ d'application. Toutes les opérations à l'intérieur de la portée sont effectuées sans contexte de transaction ambiant." social.msdn.microsoft.com/Forums/en-US/ codeproject.com/Articles/690136/Tout sur la transactionScope

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X