Hver af disse "set" kommandoer kan gå skidt, hvis objectet er låst, eks. objekt1.locked=true. Hvordan kan jeg sikre, at ingen af kaldene bliver udført, hvis bare én "set" kommando går skidt.
Jeg kunne selvølgelig skrive if object1.locked=false and object2.locked=false and ... then begin obejct1.set; object2.set; ... end; men kan det ikke gøres smartere?
if not (object1.locked or object2.locked or ...) then
Du skal under alle omstændigheder teste inden du begynder på '...set' ellers skal du igang med noget roll-back som du selv skriver og rekursive procedurer som gør det langt sværere at læse når du engang kommer tilbage koden.
... så kan du lave den sædvanlige try-except tingest med en krølle:
begin try Object1.Set; Object2.Set; Object3.Set; except on e: exception do begin if Object1.Done then Object1.Rollback; if Object2.Done then Object2.Rollback; if Object3.Done then Object3.Rollback;
I dine ObjektX-objekter kan du spørge om der er transaktioner i gang eller om der skal laves nye
var LocalTransaction : boolean; begin LocalTransaction := not Database.InTransaction; if LocalTransaction then Database.StartTransaction; try // arbejde if LocalTransaction then Database.Commit; except if LocalTransaction then Database.Rollback; raise; end; end;
type Object1Exception = class(Exception); Object2Exception = class(Exception); Object3Exception = class(Exception);
...
try except on e: Object2Exception do Object1.Rollback; on e: Object1Exception do begin Object2.Rollback; Object1.Rollback; end; on e: Object3Exception do begin Object3.Rollback; Object2.Rollback; Object1.Rollback; end; end; end;
... men det er ikke meget kønnere end det første oplæg.
Jeg fik en automatisk mail om, at jeg skulle lukke spørgsmålet, da der ikke havde været aktivitet i lang tid. Der var ikke nogen, der havde lagt et svar, jeg kunne acceptere, og jeg ville ikke til at åbne sagen igen efter 3½ år. Derfor lukkede jeg den bare. Beklager hvis det er brud med god skik. Det var ikke min hensigt.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.