Salut,
J'ai une question à 10 centimes... (comme d'hab )
Avec l'histoire de "managed, garbage collector, langage de haut niveau, etc.", je me demandais si par hasard, C# implémentait en natif une notion de transaction/savepoint.
Au niveau d'une base de données, une transaction, c'est une série d'instructions (modification de données), qu'on peut à tout moment annuler, avec une simple commande. Un savepoint, c'est grossomodo la même chose (image à un instant T des données, à laquelle on peut revenir, mais qui n'est pas threadsafe - les éléments modifiés sont lockés jusqu'à la validation du traîtement)
Je m'explique.
Mettons que dans une fonction, je fasse :
Code :
- function int test(int a, int b, int c)
- {
- a++; // J'incrémente a
- begin transaction // J'indique qu'à partir de là, je dois être capable de retrouver mes données a, b et c dans leur état actuel
- a *= b; // Je multiplie a par b <= ceci est annulable sur simple demande
- if (c == 0) // c = 0, je ne peux pas faire le traîtement désiré
- {
- rollback // J'indique que je veux retrouver mes valeurs initiale (a++, b et c)
- return a; // Je retourne la valeur de a++;
- }
- else // c'est bon, je peux faire mon traîtement
- {
- commit // je valide le traîtement : je ne pourrai plus annuler
- return a / c; // je retourne a++ * b / c
- }
- }
|
Evidement, ici le cas est simple et ne mérite pas de notion de transaction.
Mais dans mon cas, je me lance dans un traîtement lourd, complexe, et qui nécessite trop de mémoire pour travailler dans une duplication de mon environnement de travail.
En effet, j'ai un nombre indéfini d'objets que je modifie. Et je ne peux détecter une anomalie qu'une fois TOUS les objets modifiés, en allant relire leur nouvelles valeurs. Dans ce cas, je dois pouvoir annuler, modifier les objets posant problème, et relancer le traîtement (et revérifier, et ainsi de suite jusqu'à ce que toute annomalie soit levée).