Autor Téma: EMS script - Transakcie  (Přečteno 853 krát)

Offline berlusco1974

  • Nováček
  • *
  • Příspěvků: 24
  • Karma: 0
    • Verze Delphi: Delphi2010
EMS script - Transakcie
« kdy: 21-04-2017, 10:46:55 »
Zoznamujem sa s Firebirdom.
V programe EMS v klasickom scripte sa snažím o zápis transakcie (Firebird2.5).

EXECUTE BLOCK AS
begin
  SET TRANSACTION READ ONLY ISOLATION LEVEL SNAPSHOT;

  INSERT INTO TESTING VALUES (1);
  INSERT INTO TESTING VALUES (2);
  COMMIT;

  SELECT * FROM TESTING;
  ROLLBACK;
end

Precompiler Error: Syntax error - SET.

Všade na internete sa píše, že SET TRANSACTION sa používa!

Poraďte mi, prosím.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2873
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:EMS script - Transakcie
« Odpověď #1 kdy: 21-04-2017, 11:20:42 »
Úplne mimo tému:
 
Keď som začínal, tak som sa snažil všetko dať/preniesť prácu na DB server. To bolo  vplyvom teórie. To znamená uložené procedúry, pohľady a pod. Tu ma nasmerovali, aby som to radšej riešil na klientovi. Tie rady vychádzali z dlhoročných praktických skúseností. A tak okrem domén, tabuliek a generátorov nemám v DB nič.
Skús to zvážiť. A nebudeš musieť riešiť takéto problémy.

Niektoré dôvody, čo si pamätám, boli:
  • ak čosi zmením, tak mi stačí zameniť  exe a nemusím siahať do DB. Pritom netuším v akom stave (verzia) DB je.
  • lepšie sa s tým pracuje v Delphi než v DB. Môžeš si to dynamicky meniť podľa potreby a nemusíš pre každú situáciu siahať do DB.
Prebehni si moje témy, keď som ja začínal s FB. O DB som vlastne nič nevedel. Základy som mal z Access-u. Dostal som veľmi obsiahle odpovede a mali so mnou neskutočnú trpezlivosť. Využi to.
« Poslední změna: 21-04-2017, 11:22:21 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline berlusco1974

  • Nováček
  • *
  • Příspěvků: 24
  • Karma: 0
    • Verze Delphi: Delphi2010
Re:EMS script - Transakcie
« Odpověď #2 kdy: 21-04-2017, 11:30:37 »
Najskôr sa snažím príkazy vyskúšať, ktoré ja v DELPHI neskôr budem využívať, na jednoduchom scripte. Potom ten script jednoducho prekopírujem do Delphi, a po prípade upravím.

To je môj plán. :-O

Ďakujem za Vašu poznámku. Pozriem si Vaše príspevky.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2873
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:EMS script - Transakcie
« Odpověď #3 kdy: 21-04-2017, 11:39:48 »
Ja si v EMS skladám a skúšam akurát tak SQL.Text ;D  To nedokážem priamo napísať.
Ešte jedno všeobecné odporúčanie. Dlho mi trvalo kým so ho prijal. Ale to odporúčanie je správne.

Všetko v Delphi, čo je spojené s DB si vytváraj dynamicky. A nepoužívaj DB komponenty (TDBEdit a pod.). Vyhneš sa mnohým problémom. DBGrid a DBNavigator sú pre mňa zakázané veci. Namiesto DBGrid používam TVirtualStringTree.
Prečo:
  • môžeš si tam nasekať rôzne druhy údajov. Nielen z DB
  • zobrazíš si ich ako
  • klasickú tabuľku, alebo
  • ako stromovú štruktúru
A vždy pracuješ len s jediným komponentom. Je neskutočne prepracovaný.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline berlusco1974

  • Nováček
  • *
  • Příspěvků: 24
  • Karma: 0
    • Verze Delphi: Delphi2010
Re:EMS script - Transakcie
« Odpověď #4 kdy: 21-04-2017, 11:48:59 »
Pod pojmom klasický script som aj ja myslel vlastne SQL.Text .

V mojich minulých programoch (databáza Advantage), som nikdy nepoužíval databázové komponenty (DBEdit a pod). Dokonca málokedy používam aj Table. Ani teraz neplánujem. Na formulári klienta používam klasické komponenty a potom všetky zmeny (INSERT, UPDATE) dávam do jedného SQL.Text-u a uložím. A práve do toho SQL textu budem ja potrebovať tie transakcie...

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2873
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:EMS script - Transakcie
« Odpověď #5 kdy: 21-04-2017, 12:06:18 »
Citace
A práve do toho SQL textu budem ja potrebovať tie transakcie...
:o :o :o
Tak to si zjavne čosi nepochopil. Budeš mať len dve transakcie ;)
  • tá bude určená len na čítanie. SELECT * FROM MYTABLE
  • transakcia určená pre updaty - Edit, Insert a Delete
Určite budeš chcieť dodržať pravidlo atomicity a integritu DB. Všetky spolu súvisiace zmeny MUSÍŠ robiť len pod jednou transakciou. Ako na to (princíp):
Kód: [Vybrat]
  QueryInsert - nastavím parametre
  QueryUpdate - nastavím parametre
  MyTable.Insert/Edit;
  MyTable.FieldByName('Cosi').AsString := 'Aký som frajer';
  ...
  QueryInsert .Transaction.StartTransaction;

  try
     MyTable.Post;  // Vytvorené primárne kľúče sú k dispozícii !!!
    QueryInsert.ExecSQL;  // Vytvorené primárne kľúče sú k dispozícii !!!
    QueryUpdate.ExecSQL;
     QueryInsert .Transaction.Commit;
  except
     on E: EFDDBEngineException do
     begin
       QueryInsert.Transaction.Rollback;
       raise;
     end;
  end;
« Poslední změna: 21-04-2017, 12:08:28 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline berlusco1974

  • Nováček
  • *
  • Příspěvků: 24
  • Karma: 0
    • Verze Delphi: Delphi2010
Re:EMS script - Transakcie
« Odpověď #6 kdy: 21-04-2017, 12:26:36 »
Ja, ale ja potrebujem v rámci jedného SQL.Textu. V starých programoch (Advantage) to používam napr. takto:

BEGIN TRANSACTION;
TRY
  INSERT INTO cis_str (Str,StrN)
  VALUES (:Str,:StrN);
  COMMIT WORK;
CATCH ALL
  ROLLBACK WORK;
  RAISE;
END;

Nič iné nemusím nastaviť. Tu sa to takto nedá? Len s pomocou "Query.Transaction" ?

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2873
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:EMS script - Transakcie
« Odpověď #7 kdy: 21-04-2017, 12:34:12 »
Excellent
Rated 1 time
Citace
Nič iné nemusím nastaviť. Tu sa to takto nedá? Len s pomocou "Query.Transaction" ?
V princípe som Ti napísal to isté. Robiť to takto v SQL  je z môjho pohľadu poriadna kravina.

Zober si takýto prípad:
qryMaster - zbehne správne. Ty tam zavoláš Commit
qryDetail - je závislý na TableMaster a spol. ExecSQL z nejakého dôvodu padne. Zavoláš RollBack.

A teraz mi povedz, čo urobíš s TableMaster. Ostali Ti tam "hluché" záznamy. Budú Ti robiť obrovské problémy. V mojej ukážke buď zbehne všetko, alebo nič! Integrita DB je zachovaná. V Tvojom prípade nie !!!

Na také jednoduché prípady si môžeš urobiť rutinu. Najradšej v rámci nejakej vlastnej triedy.
« Poslední změna: 21-04-2017, 12:36:56 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2873
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:EMS script - Transakcie
« Odpověď #8 kdy: 21-04-2017, 12:39:33 »
Citace
Dokonca málokedy používam aj Table. Ani teraz neplánujem.
Tak TFDTable vždy používam na prepojenie s mojimi komponentami, ktoré zobrazujú požadované údaje.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline berlusco1974

  • Nováček
  • *
  • Příspěvků: 24
  • Karma: 0
    • Verze Delphi: Delphi2010
Re:EMS script - Transakcie
« Odpověď #9 kdy: 21-04-2017, 13:21:06 »
Buď sa mi uloží Master+Detail, alebo NIČ. Vráti ma to do pôvodného formulára.

BEGIN TRANSACTION;
TRY
  INSERT INTO cis_evi  (Str,StrN)  VALUES (:Str,:StrN);
  INSERT INTO cis_poh (Str,StrN,X)  VALUES (:Str,:StrN,:X);
  COMMIT WORK;
CATCH ALL
  ROLLBACK WORK;
  RAISE;
END;

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2873
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:EMS script - Transakcie
« Odpověď #10 kdy: 21-04-2017, 13:25:20 »
Ukážky boli trocha iné. Podľa mňa je najlepšie zmeniť taktiku/spôsob a nešpekulovať. To raise, za pomoci FireDAC, radšej nechám na klientovi.
Nech sa k tomu vyjadria skúsení. Ja končím. Už nemám čo napísať.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline berlusco1974

  • Nováček
  • *
  • Příspěvků: 24
  • Karma: 0
    • Verze Delphi: Delphi2010
Re:EMS script - Transakcie
« Odpověď #11 kdy: 21-04-2017, 15:09:33 »
Už aj ja nato čakám, aby sa niekto k tomu ešte vyjadril ... :-(

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1796
  • Karma: 77
    • Verze Delphi: D2007, XE3, DX10
Re:EMS script - Transakcie
« Odpověď #12 kdy: 21-04-2017, 19:07:34 »
Excellent
Rated 1 time
Nič iné nemusím nastaviť. Tu sa to takto nedá? Len s pomocou "Query.Transaction" ?
V podstate ne, protoze kdyz se podivas do reference, tak zjistis, ze SP apod. se vykonavaji v kontextu bezici transakce. Ta je bud default (pri autocommit rezimu) nebo explicitne nastartovana a to SET TRANSACTION je jen pro pristup k default transakci a ne pro zahajovani transakci. na urovni DSQL jsou jen COMMIT/ROLLBACK ev. IN AUTONOMOUS TRANSACTION DO ...

Jinak pokud chces neco vazne delat s FB, tak bych rek, ze ti nezbyde nic jineho, nez si koupit The Firebird Book od Helen Borie, protoze s dokumentaci, ktera se volne vali po webu se moc daleko nedostanes.

Princip je stejny: co thread to vlastni connection na DB, v jeho kontextu vytvoren+zahajena transakce, ta predana jako parametr Query a cela DB oeprace zapouzdrena do try-catch/commit-rollback. Ovsem na strane klienta.

Offline berlusco1974

  • Nováček
  • *
  • Příspěvků: 24
  • Karma: 0
    • Verze Delphi: Delphi2010
Re:EMS script - Transakcie
« Odpověď #13 kdy: 24-04-2017, 09:39:38 »
Citace
V podstate ne, protoze kdyz se podivas do reference, tak zjistis, ze SP apod. se vykonavaji v kontextu bezici transakce.

Áno, to si uvedomujem. Ja som si ten môj zápis na začiatku len zjednodušil. V skutočnosti by to vyzeralo takto:

EXECUTE BLOCK AS
begin
  SET TRANSACTION READ WRITE ISOLATION LEVEL SNAPSHOT;

  EXECUTE PROCEDURE TEASTING_APP (1);
  EXECUTE PROCEDURE TEASTING_APP (2);

  COMMIT;

  SELECT * FROM TESTING;
  ROLLBACK;
end
... samozrejme, keby to nezahlásilo chybu!

Citace
Ta je bud default (pri autocommit rezimu) nebo explicitne nastartovana a to SET TRANSACTION je jen pro pristup k default transakci a ne pro zahajovani transakci.

Čo znamená presne:
1. default(autocommit rezim)
2. explicitne nastartovanie
a kde si ich nadefinujem? Pri komponente v Delphi?

Citace
koupit The Firebird Book od Helen Borie, protoze s dokumentaci, ktera se volne vali po webu se moc daleko nedostanes.
Sú tam aj konkrétne príklady, nielen syntax?

Ďakujem za Vaše odpovede.


Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2873
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:EMS script - Transakcie
« Odpověď #14 kdy: 24-04-2017, 09:45:38 »

Na začiatok: vždy a všade pracuješ s transakciami.
Citace
default(autocommit rezim)
FireDAC sa sám postará o spustenie, potvrdenie či zrušenie transakcie. To sa používa len ak chceš získať údaje. NIE meniť.
Citace
2. explicitne nastartovanie
Table/Query.Transaction.StartTransaction;
+ ich potom musíš potvrdiť alebo zrušiť.
Citace
Sú tam aj konkrétne príklady, nielen syntax?
Sú a všade.
Skús si zohnať knihu Podrobná příručka InterBase/Firebird - Pavel Císař. Občas ich ponúkajú na internete. Nie v obchodoch.

Ty si tie moje témy nečítal ;D
« Poslední změna: 24-04-2017, 09:48:36 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

 

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í:
Datový typ v Delphi, který má True a False: