2017-10-06 1 views
-1

J'essaie d'utiliser une transaction pour exécuter plusieurs commandes SqlCommands au sein d'une même connexion. J'utilise un exemple du lien suivant Use Batching in Sql to improve performance avec seulement une modification étant, j'ai ajouté try/catch pour chaque cmd.ExecuteNonQuery();.Utilisation d'une transaction unique pour l'exécution de plusieurs commandes sql lorsque certaines commandes peuvent déclencher une exception

Je ne veux pas abandonner la transaction si une commande échoue et que je veux la gérer du côté de l'application. Et vouloir commettre des changements à la fin.

Mais lorsque nous recevons une exception lors de l'appel ci-dessus, l'objet Transaction est éliminé et j'obtiens une exception d'opération invalide à cause de cela lorsque j'essaie de valider à la fin. Tout pointeur sur la façon de valider la transaction même si certaines commandes ont échoué serait très utile.

Voici l'extrait que j'utilise.

using (SqlConnection connection = new SqlConnection(CloudConfigurationManager.GetSetting("Sql.ConnectionString"))) 
{ 
    conn.Open(); 
    SqlTransaction transaction = conn.BeginTransaction(); 

    foreach (string commandString in dbOperations) 
    { 
     SqlCommand cmd = new SqlCommand(commandString, conn, transaction); 
     try{ 
     cmd.ExecuteNonQuery(); 
     } 
     catch(Exception ex){ 
     //some exception handling. 
     } 
    } 

    transaction.Commit(); 

}

+1

Il n'y a aucune raison d'utiliser la transaction ici. Supprimez simplement la transaction, cela fonctionne selon vos attentes. –

+0

Pouvez-vous nous montrer quelques exemples de commandes que vous utilisez ensemble? – mjwills

+0

Salut @selvakumar, sans la transaction, je vois un succès de la performance 3x. Mais si j'utilise la transaction et ne pas commettre, je ne reçois pas l'exception, mais pourrait voir une amélioration des performances. – Kiran

Répondre

1

Certes, la réponse est de ne pas regrouper toutes les déclarations dans une seule transaction?

Ou, si certains doivent échouer toute la transaction, mais d'autres non, puis regrouper ceux qui devraient échouer toute la transaction dans une seule transaction et exécuter les autres instructions individuellement.

Êtes-vous entièrement sûr des effets de l'utilisation/de l'absence de transactions?

+0

Salut @spodger, je veux savoir s'il existe un moyen de combiner des exécutions réussies de commandes dans une transaction en ignorant celles qui ont échoué. Puisque dans les statistiques fournies dans le lien, je pouvais voir au moins 8 fois l'amélioration des performances avec l'utilisation de Transaction. – Kiran