5 votes

Transaction en codage C# pur

Je me demande s'il existe une manière simple de gérer une sorte de transaction en C#. Disons que nous avons deux propriétés et que nous aimerions mettre à jour leurs valeurs. Nous pourrions écrire :

A = GetA();
B = GetB();

Le problème est que si l'exception est levée lors de l'affectation de B, l'objet sera dans un état incohérent, car A a été mis à jour. Nous pouvons résoudre ce problème en stockant la valeur actuelle de A et en capturant une exception lors de l'affectation de B :

var tempA = A;
A = GetA(); // A is up to date
try { B = GetB(); } catch { A = tempA; } // B is up to date also or A is reverted

Même la solution ci-dessus n'est pas sûre parce que l'exception peut être levée lors de l'annulation de A, mais la question est de savoir s'il existe des mécanismes intégrés dans .NET qui simplifient de telles opérations ?

Je pourrais imaginer une déclaration comme celle qui suit :

transaction { A = GetA(); B = GetB(); }

Ou une construction de code comme :

Transaction.Enter();
A = GetA();
B = GetB();
Transaction.Leave();

Avant la transaction, l'état de la machine sera stocké et après la transaction, il sera rétabli en cas d'exception. Existe-t-il quelque chose de ce genre en .NET ?

10voto

wudzik Points 11198

"TransactionScope n'est pas seulement destiné aux bases de données. Chaque composant qui implémente l'interface IEnlistmentNotification peut participer à la validation en deux phases de la portée de la transaction.

Voici un exemple de stockage transactionnel en mémoire : http://www.codeproject.com/KB/dotnet/Transactional_Repository.aspx "

Source : https://stackoverflow.com/a/2273902/1714342

Je pense que vous pouvez mettre en œuvre ceci IEnlistmentNotification et utiliser l'interface TransactionScope

4voto

Tamim Salem Points 1479

Vous pouvez utiliser la classe TransactionScope.

Ejemplo:

using(var scope = new TransactionScope())
{
    DoAction1();
    DoAction2();

    scope.Complete();
}

2voto

vendettamit Points 1521

Il n'y a pas de fonction intégrée pour les transactions d'objets. Mais il existe des bibliothèques tierces qui permettent de gérer l'état des objets.

vous pouvez consulter cette question similaire.

https://stackoverflow.com/a/1765642/881798

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