3 votes

Quel est l'avantage d'envelopper chaque invocation de sql/stored proc dans une transaction ?

Le code suivant exécute une procédure stockée. La procédure stockée ne contient qu'une seule commande. Y a-t-il un avantage à tout regrouper dans une transaction, même si elle ne contient qu'une seule instruction SQL (ou une procédure stockée qui ne contient qu'une seule instruction SQL) ?

Dans l'exemple de code ci-dessous, si la suppression échoue, elle échoue. Il n'y a rien d'autre à annuler (il semble). Alors pourquoi tout est enveloppé dans une transaction de toute façon ?

using (ITransactionManager transMan = repository.TransactionManager())
using (IController controller = repository.Controller())
{
    transMan.BeginTransaction();
    try
    {
        //DELETE FROM myTable where Id=@id
        controller.Delete(id);
        transMan.CommitTransaction();
    }
    catch
    {
        transMan.RollbackTransaction();
        throw;
    }
}

5voto

Oded Points 271275

Vous ne perdez pas grand-chose à l'envelopper dans une transaction (puisqu'une transaction légère serait utilisée), et si vous ajoutez davantage de logique à votre couche métier, vous disposez déjà d'une gestion des transactions fonctionnelle.

Ce code fonctionnera également avec des transactions imbriquées, alors que si vous n'utilisiez pas de transaction à ce niveau, vous pourriez perdre certains avantages en fonction de la façon dont le code et la procédure stockée ont été structurés.

Il est également possible que la procédure stockée soit modifiée et comporte plusieurs instructions. Dans ce cas également, la gestion des transactions est toujours en place.

Je le garderais.

2voto

Patrick Karcher Points 11927

De la recherche au code il n'y a pas de raison apparente pour la transaction. Cela ne nuit à rien, mais peut être source de confusion, car on se demande alors pourquoi elle est là.

Cependant, si votre code commenté représente un procédure stockée La procédure peut prendre plusieurs mesures et, si l'échec survient après un certain temps, il peut y avoir des mesures de retour en arrière. Si c'est le cas, il pourrait y avoir une très bonne raison pour la transaction.

2voto

driis Points 70872

Même si vous ne démarrez pas explicitement une transaction, toutes les requêtes de la base de données s'exécutent dans une transaction implicite. Jetez un coup d'œil à ce conseil de la page d'accueil du NHProf . Il décrit très bien pourquoi vous devez presque toujours utiliser une transaction explicite.

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