Ho controllato la documentazione :http://www.freepascal.org/docs-html-3.0.0/fcl/sqldb/tsqlconnection.html
property OnLog: TDBLogNotifyEvent; [rw]//Event handler for logging events
property LogEvents: TDBEventTypes; [rw]//Filter for events to log
Il filtro e la callback possono esserti d'aiuto per fare un minimo di diagnostica?
Stilgar
Controllando il codice : https://github.com/graemeg/freepascal/blob/master/packages/fcl-db/src/sqldb/sqldb.pp (https://github.com/graemeg/freepascal/blob/master/packages/fcl-db/src/sqldb/sqldb.pp)
procedure TSQLTransaction.StartTransaction;
var db : TSQLConnection;
begin
if Active then
DatabaseError(SErrTransAlreadyActive);
Controllando la EndTransaction:
procedure TSQLTransaction.EndTransaction;
begin
Case Action of
caCommit, caCommitRetaining :
Commit;
caNone,
caRollback, caRollbackRetaining :
if not (stoUseImplicit in Options) then
RollBack
else
CloseTrans;
end;
end;
A questo punto mi viene da pensare :
In caso di caduta della rete
1) Cambiare il modo di fare la commit in caNone.
2) Chiudere la transazione.
Appena rilevata la rete attiva
3) ripristinare la transazione al commit desiderato.
4) riaprire la transazione.
Questo per evitare il problema di stato della connessione al db (che si appoggia alla transazione).
L'alternativa è sostituire la gestione della transazione con una Custom. Questa strada mi sembra più impegnativa però.
TDBTransaction = Class(TComponent)
Private
FActive : boolean;
FDatabase : TDatabase;
FDataSets : TList;
FOpenAfterRead : boolean;
Function GetDataSetCount : Longint;
Function GetDataset(Index : longint) : TDBDataset;
procedure RegisterDataset (DS : TDBDataset);
procedure UnRegisterDataset (DS : TDBDataset);
procedure RemoveDataSets;
procedure SetActive(Value : boolean);
Protected
Function AllowClose(DS: TDBDataset): Boolean; virtual;
Procedure SetDatabase (Value : TDatabase); virtual;
procedure CloseTrans;
Il "problema" è che la closeTrans è nascosta ad un chiamante esterno.
Stilgar
potrebbe capitare che le transazioni rimangono in quelle che in ambiente firebird vengono definite come: limbo transactions
si tratta di transazioni che firebird non sa come trattare
prova a lanciare questo comando, se ci sono transazioni limbo dovresti vederle
gfix -user SYSDBA -password masterkey 127.0.0.1:DATABASE_NAME.FDB -list