Lazarus 3.2 (2024.02.28.)
Letöltés

  • Oldal:
  • 1

TÉMA:

SQLdb tranzakciókezelés 2015 dec. 10 09:25 #1700

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1

Gábor írta: Kapcsold be az "Azonosítók kiegészítése . után" lehetőséget, amivel egy kis ablak jelenik majd meg az elérhető metódusok és tulajdonságok listájával amikor egy azonosító után .-ot írsz.
Így találod meg a menüből indulva: "Eszközök / Beállítások / Kódeszközök / Azonosítók kiegészítése / Azonosítók kiegészítése . után"


Ez alapból be van kapcsolva, használom. Köszönöm!

SQLdb tranzakciókezelés 2015 dec. 10 09:21 #1699

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
A TSQLQuery több lépcsőben, de a TDataset lezármazottja és így örökölte az Open metódust is.

makgab írta: A doksijában nem látom az Open metódust. :(


Kapcsold be az "Azonosítók kiegészítése . után" lehetőséget, amivel egy kis ablak jelenik majd meg az elérhető metódusok és tulajdonságok listájával amikor egy azonosító után .-ot írsz.
Így találod meg a menüből indulva: "Eszközök / Beállítások / Kódeszközök / Azonosítók kiegészítése / Azonosítók kiegészítése . után"
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

SQLdb tranzakciókezelés 2015 dec. 10 09:18 #1698

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
Köszönöm, értem a tranzakciókat, nem ez a dilemmám. :) Pl. egy tranzakcióban (INSERT SQL parancs) kezelem egy szállítólevél tétel és fejszintű adatainak rögzítését.
De egy karbantartás formon (pl. ügyféltípusok tábla) nem kell igazából tranzakció.
Arra jutottam, hogy egyszerű karbantartások form-nál az OnFormClose-ban lezárom a tranzakciót. A speciálisabb esetekben (pl. szállítólevél rögzítése) pedig egyedileg kezelem, ahogy te is írtad.
Köszönöm az infókat!

SQLdb tranzakciókezelés 2015 dec. 10 09:09 #1697

  • JohnnyK
  • JohnnyK profilkép
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 78
  • Köszönetek: 16
A tranzakció arra jók, hogy csoportosítani lehet velük SQL parancsokat. Két előnyét tudom kiemelni:
  • Ha például van 100 INSERT parancsod, akkor sokkal gyorsabban fogsz végezni az írással, ha egy tranzakcióba tömöríted őket, mintha INSERT-enként csinálnál 100 egymás utáni tranzakciót.
  • Ha az SQL csoport egyik parancsa valamiért kudarcot vall, akkor Rollback-elni tudod a hozzá szorosan kapcsolódó előzőeket.
Összességében neked kell tudni megszervezni és kitalálni a Commit és Rollback parancsok legjobb helyét a programod működése alapján. Ha például csak olyan SQL parancsaid vannak, amik gombnyomásonként lefuttatnak egy-egy SELECT-et, akkor valóban nem kell a tranzakciókat nagyon szervezgetni, mert minden egyes SELECT kap egy tranzakciót, aztán annyi. Ha viszont van több SQL-ed is, amik nagyjából egyszerre kéne, hogy fussanak (vagy legalábbis nagyon egymás után), és korlátozottan épülnek csak egymásra, akkor viszont sebességet nyerhetsz, ha jól kezded csoportosítani a Commit parancsok helyét a programban.
Emellett létezik olyan, hogy az egyes adatábázisok ismernek olyat, hogy AUTOCOMMIT. Ez magától is kezelgetheti a tranzakciókat (netán akár jól is), de ha kikapcsolod, akkor elvileg a tranzakciókat csak te irányítod a programból.

SQLdb tranzakciókezelés 2015 dec. 10 07:38 #1696

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
Vagy az SQLQuery.AfterClose-ában is lehet(?):
procedure SQLQueryAfterClose(DataSet: TDataSet);
begin
  SQLTransaction.Active := False;
  // vagy:
  // SQLTransaction.EndTransaction;  // -> Rollback
  // vagy:
  // SQLTransaction.Commit;
end;

Mit javasoltok?

SQLdb tranzakciókezelés 2015 dec. 09 15:53 #1695

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1

makgab írta: Olyan lehetséges, hogy az SQLTransaction komponens active:=false alapból és mégis indul tranzakció? A kódból indítok tranzakciót:


Aha... egy SQLQuery-t futtatva automatikusan tranzakció indul!!
SQLQuery.Open;
// ... adatolvasás... stb.
SQLQuery.Close;
// tranzakcióban is marad

Ennek így is kell működnie?
Akkor SQLQuery után le kell zárni a tranzakciót ?
SQLQuery.Close;
SQLTransaction.Active := False;
// vagy:
// SQLTransaction.EndTransaction;

A doksijában nem látom az Open metódust. :(

SQLdb tranzakciókezelés 2015 dec. 09 15:43 #1694

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
Olyan lehetséges, hogy az SQLTransaction komponens active:=false alapból és mégis indul tranzakció? A kódból indítok tranzakciót:
DM.SQLTranaction.StartTransaction;
de erre azt kapom, hogy már van tranzakció.

Az
SQLTransaction.Action:=caCommit; // vagy caCommitRetaining
még a régi Delphi-s (Firebird) időkből. :)
Vagy emiatt lehet? Bár ez " Currently unused in SQLDB" (www.freepascal.org/docs-html/3.0.0/fcl/sqldb/tsqltransaction.html)

SQLdb tranzakciókezelés 2015 dec. 09 08:56 #1690

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
Az SqlDBHowto -ban olvasom, hogy:

...a TSQLTransaction is destroyed, an automatic 'rollback' will be executed...

Példa:
Program ShowData;
 
function CreateQuery(pConnection: TIBConnection; pTransaction: TSQLTransaction): TSQLQuery;
begin
  result := TSQLQuery.Create;
  result.Database := pConnection;
  result.Transaction := pTransaction
end;
 
var 
  AConnection  : TSQLConnection;
  ATransaction : TSQLTransaction;
  Query        : TSQLQuery;
 
begin
  AConnection := CreateConnection;
  ATransaction := CreateTransaction(AConnection);
  Query := CreateQuery(AConnection, ATransaction);
  Query.SQL.Text := 'select * from tblNames';
  AConnection.Open;
  Query.Open;
  while not Query.Eof do
  begin
    Writeln('ID: ', Query.FieldByName('ID').AsInteger, 'Name: ' +
                                  Query.FieldByName('Name').AsString);
    Query.Next;
  end;
  Query.Close;
  AConnection.Close;
  Query.Free;
  ATransaction.Free;
  AConnection.Free;
end.

Úgy értve, hogy az ATransaction.Free után auto rollback van, hogy ha hiba történt? Jól értem?

SQLdb tranzakciókezelés 2015 dec. 09 08:41 #1689

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
Üdv!
Egyelőre a kivételeket a főformban kezelem és logolom őket:
procedure TmainForm.FormCreate(Sender: TObject);
begin
  // catch exceptions
  Application.OnException := @CustomExceptionHandler;
...
 
procedure TmainForm.CustomExceptionHandler(Sender: TObject; E: Exception);
begin
  ...
  Screen.Cursor:=crDefault;
  ShowMessage( 'A futás közben egy kivétel keletkezett:' + ENTER + E.Message );
 	ErrorLog( E.Message, Now, GetEnvironmentVariable('USERNAME') );
  ...
end;

Ha itt elkapok mindent, akkor bárhol máshol már nem tudok elkapni semmilyen kivételt, ugye? Az SQLdb tranzakcióját rollback-elni szeretném, ha hiba van. Így nem fogom tudom elkapni az EBatabaseError kivételeket.
Vagy külön kezeljem a CustomExceptionHandler()-ben az EDatabaseError kivételeket és ott rollbackeljek?
Ti hogy csináljátok?

  • Oldal:
  • 1