Faire un Rollback Globale apres plusieur commit successif

Faire un Rollback Globale apres plusieur commit successif - SQL/NoSQL - Programmation

Marsh Posté le 27-10-2005 à 11:31:43    

bonjour, :jap:  
 
je suis en train de créer un processus. C'est une procédure PL/SQL Oracle qui met a jour une volumétrie importante de données. Je suis par consequent obligé de faire des Commit régulièrement pour ne pas exploser les rollbacks segments.
 
Cépendant, je souhaiterais a la fin du processus, etre capable de faire un rollback général si tout ne s'est pas bien déroulé. Est ce possible?
 
merci pour les réponses  :bounce:  :bounce:


Message édité par molarisapa le 27-10-2005 à 12:19:32
Reply

Marsh Posté le 27-10-2005 à 11:31:43   

Reply

Marsh Posté le 27-10-2005 à 12:17:00    

Non, ce n'est pas possble. Désolé.
 
Une solution consiste à faire une sauvegarde avant et une restitution après.
 
Une autre solution consiste à effectuer les tests péalables nécessaires pour ne pas s'engager dans un processus qui sera avorté.

Reply

Marsh Posté le 27-10-2005 à 16:48:15    

impossible de le faire. Un commit n'est pas reversible.


---------------
MZP est de retour
Reply

Marsh Posté le 27-10-2005 à 21:37:20    

Cependant, tu dois pouvoir revenir à un état précis de la base, en faisant appel à un DBA, mais ce n'est pas du SQL, ce sont des fonctionnalités Oracle, à prévoir.
 
(utile uniquement si ton process est particulier et effectué une seule fois, par exemple)

Reply

Marsh Posté le 28-10-2005 à 11:16:23    

mon process sera lancé par un excecutable VB une fois par an. je vais donc faire via le prog VB, un dump de la base avant le process. et une fois le traitement terminé, j'afficherai un message utilisateur pour dire (traitement terminé avec erreur, voulez vous réinitialiser la base à l'état avant le traitement ....) et je ferai un import

Reply

Marsh Posté le 30-10-2005 à 11:05:55    

Petite précision.
 
Oracle, comme beaucoup de sgbd, support les transactions imbriquées.
 
Donc en réalité, si, c'est tout à fait possible de faire un rollback après une série de commit.
 
Par contre, ça ne résoud pas le problème initial, puisque commiter une sous-transaction ne participe pas à réduire la taille du rollback segment.
 

Code :
  1. declare verif number;
  2. declare verif2 number;
  3. begin transaction permiere;
  4. update toto set truc = 'machin' where test > 0;
  5. begin transaction seconde;
  6. delete toto where truc = 'machin' where test = 1;
  7. select count(*) into verif where truc = 'machin';
  8. if verif > 0
  9. begin
  10.    rollback seconde;
  11. end
  12. else
  13. begin
  14.    commit seconde;
  15. end;
  16. select count(*) into verif2 where truc <> 'machin';
  17. if verif2 > 0
  18. begin
  19.    commit premiere;
  20. end
  21. else
  22. begin
  23.    rollback premiere; -- Ceci va annuler tout le lot, y compris la transaction "seconde" si elle a été commitée.
  24. end;


 
Normalement, à quelques problèmes de syntaxe près, ça doit marcher.
Et on vois bien à quoi sert de faire deux transactions imbriquées.


Message édité par Arjuna le 30-10-2005 à 11:08:06
Reply

Marsh Posté le 30-10-2005 à 11:48:36    

On peut aussi faire sous Oracle :
 
SAVEPOINT <savepoint name>;
 
(...)
 
ROLLBACK TO <savepoint name>;
 
Assez pratique à l'usage, quand on veut faire des COMMIT tous les 1000 enregistrements, tout en gardant la possibilité d'annuler juste une partie des traitements.

Reply

Marsh Posté le 30-10-2005 à 11:58:15    

en effet :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed