Forum Delphi.cz

Databáze => Firebird a Interbase => Téma založeno: berlusco1974@azet.sk 21-04-2017, 10:46:55

Název: EMS script - Transakcie
Přispěvatel: berlusco1974@azet.sk 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.
Název: Re:EMS script - Transakcie
Přispěvatel: Stanislav Hruška 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:
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.
Název: Re:EMS script - Transakcie
Přispěvatel: berlusco1974@azet.sk 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.
Název: Re:EMS script - Transakcie
Přispěvatel: Stanislav Hruška 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:
A vždy pracuješ len s jediným komponentom. Je neskutočne prepracovaný.
Název: Re:EMS script - Transakcie
Přispěvatel: berlusco1974@azet.sk 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...
Název: Re:EMS script - Transakcie
Přispěvatel: Stanislav Hruška 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 ;)
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;
Název: Re:EMS script - Transakcie
Přispěvatel: berlusco1974@azet.sk 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" ?
Název: Re:EMS script - Transakcie
Přispěvatel: Stanislav Hruška 21-04-2017, 12:34:12
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.
Název: Re:EMS script - Transakcie
Přispěvatel: Stanislav Hruška 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.
Název: Re:EMS script - Transakcie
Přispěvatel: berlusco1974@azet.sk 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;
Název: Re:EMS script - Transakcie
Přispěvatel: Stanislav Hruška 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ť.
Název: Re:EMS script - Transakcie
Přispěvatel: berlusco1974@azet.sk 21-04-2017, 15:09:33
Už aj ja nato čakám, aby sa niekto k tomu ešte vyjadril ... :-(
Název: Re:EMS script - Transakcie
Přispěvatel: pf1957 21-04-2017, 19:07:34
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.
Název: Re:EMS script - Transakcie
Přispěvatel: berlusco1974@azet.sk 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.

Název: Re:EMS script - Transakcie
Přispěvatel: Stanislav Hruška 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
Název: Re:EMS script - Transakcie
Přispěvatel: berlusco1974@azet.sk 24-04-2017, 09:52:02
Ok. Default a explicit pochopil som.

Citace
Sú a všade.

Ty si tie moje témy nečítal ;D

To znamená, v tej knihe sú na všetky príkazy uvedené konkrétne príklady?

Název: Re:EMS script - Transakcie
Přispěvatel: berlusco1974@azet.sk 24-04-2017, 09:59:44
Tú knihu od Cisára mám. Práve odtiaľ som zobral ten príkaz SET TRANSACTION, čo mi nefunguje, aj keď je tam uvedený aj s dostupnosťou na DSQL...

Mne sa jedná teraz o tú druhú knihu The Firebird Book od Helen Borie. Je tam len syntax, alebo konkrétne príklady?
Název: Re:EMS script - Transakcie
Přispěvatel: pf1957 24-04-2017, 10:09:38
Mne sa jedná teraz o tú druhú knihu The Firebird Book od Helen Borie. Je tam len syntax, alebo konkrétne príklady?
Syntax je tam jen na okraj, ta kniha se zabyva komplexne vlastnostmi RDBMS Firebird a fragmenty prikazu tam jsou na dokresleni vykladu, ale neni to ucebnice a copy&paste priklady tam nejsou
Název: Re:EMS script - Transakcie
Přispěvatel: berlusco1974@azet.sk 24-04-2017, 10:20:06
Ok. Ďakujem
Název: Re:EMS script - Transakcie
Přispěvatel: pf1957 24-04-2017, 10:44:46

EXECUTE BLOCK AS
begin
  SET TRANSACTION READ WRITE ISOLATION LEVEL SNAPSHOT;
...
Transakce vzdy zahajuje klient (krome autonomous). A podle me je tohle z principu spatne, protoze ty ten kod spoustis nejakym nastrojem, ktery predstavuje klienta a sam si uz nejakou transakci pro spoustene SQL prikazy vytvoril. A taky ma nejaky prikaz pro commitnuti davky prikazu, FB konkretne COMMIT WORK.

Normalni je transakce ridit z aplikace pres API resp. pres konponenty, ktere to API zapouzdruji.