Odpověď

Upozornění - zatímco jste četl, přišlo 7 nových odpovědí. Možná byste měl upravit svůj příspěvek.
Jméno:
E-mail:
Předmět:
Ikona zprávy:

Ověření:
Kolik je šest plus čtyři (slovem):

Zkratky: stiskněte shift+alt+s pro odeslání nebo shift+alt+p pro prohlédnutí


Shrnutí tématu

Poslal: pf1957
« kdy: 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.

Poslal: berlusco1974@azet.sk
« kdy: 24-04-2017, 10:20:06 »

Ok. Ďakujem
Poslal: pf1957
« kdy: 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
Poslal: berlusco1974@azet.sk
« kdy: 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?
Poslal: berlusco1974@azet.sk
« kdy: 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?

Poslal: Stanislav Hruška
« 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
Poslal: berlusco1974@azet.sk
« 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.

Poslal: pf1957
« kdy: 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.
Poslal: berlusco1974@azet.sk
« kdy: 21-04-2017, 15:09:33 »

Už aj ja nato čakám, aby sa niekto k tomu ešte vyjadril ... :-(
Poslal: Stanislav Hruška
« 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ť.
Poslal: berlusco1974@azet.sk
« 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;
Poslal: Stanislav Hruška
« 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.
Poslal: Stanislav Hruška
« kdy: 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.
Poslal: berlusco1974@azet.sk
« 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" ?
Poslal: Stanislav Hruška
« 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;