Autor Téma: Jedna transakcia, viac TFDCommand-s  (Přečteno 907 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2648
  • Karma: 25
    • Verze Delphi: XE7 professional
Jedna transakcia, viac TFDCommand-s
« kdy: 11-09-2016, 19:17:29 »
Používam jednu inštanciu transakcie.
Kód: Delphi [Vybrat]
  1. function TGroupDet.DeleteRecord: Boolean;
  2. var
  3.   IsExecute: Boolean;
  4. begin
  5.   Result := False;
  6.   IsExecute := True;
  7.   FcmdGroupUpdt.Transaction.StartTransaction;
  8.  
  9.   try
  10.     FcmdGroupUpdt.Execute();  
  11.   except
  12.     Result := False;
  13.   end;
  14.  
  15.   if IsExecute then
  16.   begin
  17.     FcmdGroupDetUpdt.Transaction.StartTransaction;
  18.    
  19.     try
  20.       FcmdGroupDetUpdt.Execute();  
  21.     except
  22.       Result := False;
  23.     end;
  24.   end;
  25.  
  26.   if IsExecute then
  27.   begin
  28.     FcmdGroupUpdt.Transaction.Commit;
  29.     FcmdGroupDetUpdt.Transaction.Commit;
  30.     Result := True;
  31.   else
  32.   begin
  33.     FcmdGroupUpdt.Transaction.Rollback;
  34.     FcmdGroupUpdt.Transaction.Rollback;
  35.     Fault('Nepodarilo sa vykonať akciu.');
  36.   end;  
  37. end;
  38.  
Vzhľadom na skutočnosť, že Transakcia je atomická, ta správne by malo byť:
Kód: Delphi [Vybrat]
  1. function TGroupDet.DeleteRecord: Boolean;
  2. var
  3.   IsExecute: Boolean;
  4. begin
  5.   Result := False;
  6.   IsExecute := True;
  7.   FcmdGroupUpdt.Transaction.StartTransaction;
  8.  
  9.   try
  10.     FcmdGroupUpdt.Execute();  
  11.   except
  12.     Result := False;
  13.   end;
  14.  
  15.   if IsExecute then
  16.   begin
  17.     try
  18.       FcmdGroupDetUpdt.Execute();  
  19.     except
  20.       Result := False;
  21.     end;
  22.   end;
  23.  
  24.   if IsExecute then
  25.   begin
  26.     FcmdGroupUpdt.Transaction.Commit;
  27.     Result := True;
  28.   else
  29.   begin
  30.     FcmdGroupUpdt.Transaction.Rollback;
  31.     Fault('Nepodarilo sa vykonať akciu.');
  32.   end;  
  33. end;
  34.  
No nie som si istý.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1700
  • Karma: 70
    • Verze Delphi: D2007, XE3, DX10
Re:Jedna transakcia, viac TFDCommand-s
« Odpověď #1 kdy: 11-09-2016, 19:27:24 »
Normalni zpusob prace s transakci je:
Kód: Delphi [Vybrat]
  1. txn.StartTransaction;
  2. try
  3.   upd1.Execute;
  4.   upd2.Execute;
  5.   ...
  6.   txn.Commit;
  7. except
  8.   txn.Rollback;
  9.   raise;
  10. end;
  11.  
  12.  

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2648
  • Karma: 25
    • Verze Delphi: XE7 professional
Re:Jedna transakcia, viac TFDCommand-s
« Odpověď #2 kdy: 11-09-2016, 19:52:20 »
Vďaka. Také niečo bolo aj v príklade. + niečo naviac, čo ma mýlilo. Mám teraz trochu čo prerábať :)
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2648
  • Karma: 25
    • Verze Delphi: XE7 professional
Re:Jedna transakcia, viac TFDCommand-s
« Odpověď #3 kdy: 14-09-2016, 14:41:19 »
Hm a je tam vhodné namiesto raise použiť Abort? Ja sa sám starám o zobrazenie oznamu. Ešte pred raise/Abort.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1700
  • Karma: 70
    • Verze Delphi: D2007, XE3, DX10
Re:Jedna transakcia, viac TFDCommand-s
« Odpověď #4 kdy: 14-09-2016, 15:30:29 »
Hm a je tam vhodné namiesto raise použiť Abort? Ja sa sám starám o zobrazenie oznamu. Ešte pred raise/Abort.
Osobne Abort povazuju za podivnost a celkem me nenapada zadny smysluplny priklad, kdy to pouzit. Spis je to nastroj, jak simulovat prikaz goto pres vice subroutin a snaha zapojit exceptions do programovani logiky, coz je hrubka.

Exceptions je neco vyjimecneho a pokud uz vznikne, je treba ji radne osetrit, zaprotokolovat apod.  A u transakce se jedna v podstate o simulovani try-finally - vsimni si, ze start transakce je pred try, tj. pokud by se nepovedlo transakci zahajit, bude to resit nekde nekdo "chytrejsi". V tomto pripade se jedna o propagovani puvodni exceptions tomu "chytrejsimu", kdo si bude vedet rady, jak aplikaci z takove chyby zotavit. Pouziti Abort by bylo vylozene hrubkou.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2648
  • Karma: 25
    • Verze Delphi: XE7 professional
Re:Jedna transakcia, viac TFDCommand-s
« Odpověď #5 kdy: 14-09-2016, 15:34:41 »
V príklade je použitý nasledovne
Kód: [Vybrat]
procedure TForm1.ClientDataSet1BeforePost(DataSet: TDataSet);
begin
  if DBEdit1.Text = '' then
    Abort;
  DataSet.Fields[2].AsString := DBEdit1.Text;
end;
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1700
  • Karma: 70
    • Verze Delphi: D2007, XE3, DX10
Re:Jedna transakcia, viac TFDCommand-s
« Odpověď #6 kdy: 14-09-2016, 15:42:20 »
V príklade je použitý nasledovne
Kód: [Vybrat]
  if DBEdit1.Text = '' then
    Abort;
  ...
end;
No a to je taky pekna prasarna, protoze ten, kdo ty exception odchyti bude vedet kulovy, co se stalo krome toho, ze se neco nepovedlo  >:(
Kdyz uz ma nekdo potrebu vyvolat vyjimku, tak ma napsat neco takoveho:
Kód: Delphi [Vybrat]
  1.   if DBEdit1.Text = '' then
  2.     raise XMissingValue.CreateFmt('%s value is empty',[DBEdit1.Name]);
  3.  
Osobne bych na existenci Abort zcela zapomel jako na with do a podobne kokotiny.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1641
  • Karma: 68
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (teď XE8 a XE10)
    • O Delphi v češtině
Re:Jedna transakcia, viac TFDCommand-s
« Odpověď #7 kdy: 15-09-2016, 21:40:05 »
Moc se s tebou nechci přít PF, ale já sem tam Abort použiji. Ve skutečnosti je to ekvivalent raise EAbort, s tím že globální ovladač EAbort zpracuje potichu. V určitých situacích to použiji když chci ukončit nějakou akci, většinou po tom co se něco uživateli řekne - většinou v souvislosti s právy.
Embarcadero MVP - Czech republic

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1700
  • Karma: 70
    • Verze Delphi: D2007, XE3, DX10
Re:Jedna transakcia, viac TFDCommand-s
« Odpověď #8 kdy: 16-09-2016, 07:58:40 »
Excellent
Rated 1 time
Moc se s tebou nechci přít PF, ale já sem tam Abort použiji. Ve skutečnosti je to ekvivalent raise EAbort, s tím že globální ovladač EAbort zpracuje potichu. V určitých situacích to použiji když chci ukončit nějakou akci, většinou po tom co se něco uživateli řekne - většinou v souvislosti s právy.
Ja se taky nechci prit, ale mam k tomu lety overeny a pomerne striktni pristup:
  • vyjimka se nikdy nepouziva jako soucast logiky - to uz mam od samych zacatku, kdyz se exception objevily v Ade
  • exception loguju nejblize mistu, kde je dostatek informaci o kontextu, v jakem vznikla, zejmena pro potreby supportu level#2
  • nic nerikat uzivateli v nizsich vrstvach je podminka pro tvorbu reusable kodu, abys mohl pouzit stejny kod napr. v non-visual aplikaci jako je sluzba, nejaky server apod.
  • nekdy po ceste odchytavani exceptions mivam jeste nejake retry mechanismy, ktere pak rozlisuji, jestli se operace vubec nepovedla nebo povedla na n-ty pokus aj.
  • uzivateli  neco rikam az v prezentacni vrstve, tedy zpravidla nekde v hornich vrstvach aplikace - a kdyz mu to reknu, uz neni komu tu exception dal propagovat - pokud se to dela, tak uz se s ni simuluje goto. Uzivatel se tak maximalne muze rozhodnout, jestli operaci zopakuje, udela misto ni jinou nebo ji zrusi. Ale to uz je vsechno na normalni zavreni formulare apod.
  • totez plati v pripade, ze server vraci clientovi odpoved s chybou - tam uz taky neni komu exception propagovat - technicky personal ji ma zalogovanou a uzivatel dostane chybu v odpovedi, jedine snad v nejakych spcifickych pripadech vyvolat automaticky restart serveru

Jinak me dost vadi, ze jazyky jako Delphi a C#  nemaji v deklaraci tridy povinnost explicitne vypsat seznam exceptions, ktere trida emituje, aby se jejich handlovani dostalo pod kontrolu prekladace.


Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2648
  • Karma: 25
    • Verze Delphi: XE7 professional
Re:Jedna transakcia, viac TFDCommand-s
« Odpověď #9 kdy: 29-09-2016, 11:48:32 »
Čo som čítal v návodoch, tak tam píšu, že jediný rozdiel medzi Abort a raise je len v tom, že Abort nezobrazí koncovému užívateľovi správu. Citujem
Citace
Raises a silent exception.

Use Abort to escape from an execution path without reporting an error.
 
Abort raises a special "silent exception" (EAbort), which operates like any other exception, but does not display an error message to the end user. Abort redirects execution to the end of the last exception block.
Teraz som tak trocha na pochybách, ale riadim sa tým čo napísal pf1957.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1700
  • Karma: 70
    • Verze Delphi: D2007, XE3, DX10
Re:Jedna transakcia, viac TFDCommand-s
« Odpověď #10 kdy: 29-09-2016, 12:29:17 »
Čo som čítal v návodoch, tak tam píšu, že jediný rozdiel medzi Abort a raise je len v tom, že Abort nezobrazí koncovému užívateľovi správu.

No ale o to prece jde: IMHO  nevidim prakticky smysl ve spravne architektonicky navrzene a implementovane aplikaci zatajovat vyjimku pred uzivatelem - tim se IMHO vetsinou dohani nejaky deficit v navrhu a de facto se tim simuluje goto prikaz.

A jestli si to pamatuju, tak jsi dotaz na toto tema vznesl tam, kde slo navic o reraise exception a tam je to vylozene hrubka, protoze puvodni tridu exceptions zahodis spolu s  veskerymi informacemi o chybe a nahradil bys ji nic nerikajicim EAbort. To nemuze vest k nicemu jinemu nez k obtizne pouzitelnemu kodu.


 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: