Autor Téma: Dvě FDConnection řízené jednou FDTransaction končí chybou  (Přečteno 925 krát)

Offline KarelHorky

  • Hrdina
  • ****
  • Příspěvků: 282
  • Karma: 10
    • Verze Delphi: XE6, Delphi 10.2 Tokyo
Předělávám starší projekt, kde používám komponenty IBX (IBExpress), na FireDAC, databáze jsou Firebird. Jednu funkčnost z IBX se mi nepodařilo převést a to řízení dvou FDConnection jednou společnou FDTransaction. Samotné napojení funguje, chyba se objeví až v Prepare první FDQuery, napojené na jednu z FDConnection. Přesné znění chyby: [FireDAC][Phys][FB]-343. Cannot set default transaction.
Kód: Delphi [Vybrat]
  1.     FDPhysFBDrivLink: TFDPhysFBDriverLink;
  2.     FDGUIxWaitCur: TFDGUIxWaitCursor;
  3.     FDConn: TFDConnection;
  4.     FDTran: TFDTransaction;
  5.     FDSQL: TFDQuery;
  6.     DB2: TFDConnection;
  7.     TB2: TFDQuery;
  8.  
  9. try
  10.     FDConn.Close;
  11.     FDConn.Params.Clear;
  12.     FDConn.Params.Add('DriverID=FB');
  13.     FDConn.Params.Add('Database=c:\a\DBJedna.fdb');
  14.     FDConn.Params.Add('Server=LOCALHOST/3050');
  15.     FDConn.Params.Add('Protocol=TCPIP');
  16.     FDConn.Params.Add('user_name=JMENO');
  17.     FDConn.Params.Add('password=heslo');
  18.     FDConn.Params.Add('lc_ctype=WIN1250');
  19.  
  20.     DB2.Close;
  21.     DB2.Params.Clear;
  22.     DB2.Params.Add('DriverID=FB');
  23.     DB2.Params.Add('Database=c:\a\DBDva.fdb');
  24.     DB2.Params.Add('Server=LOCALHOST/3050');
  25.     DB2.Params.Add('Protocol=TCPIP');
  26.     DB2.Params.Add('user_name=JMENO');
  27.     DB2.Params.Add('password=heslo');
  28.     DB2.Params.Add('lc_ctype=WIN1250');
  29.  
  30.     FDConn.Transaction := FDTran;
  31.     DB2.Transaction := FDTran;
  32.     FDSQL.Transaction := FDTran;
  33.     TB2.Transaction := FDTran;
  34.  
  35.     FDConn.Open;
  36.     DB2.Open;
  37.     if not FDTran.Active then
  38.       FDTran.StartTransaction;
  39.  
  40.     FDSQL.Close;
  41.     FDSQL.SQL.Text := 'select count(id) from dph';
  42.     FDSQL.Prepare;   { tady je chyba [FireDAC][Phys][FB]-343. Cannot set default transaction }
  43.     FDSQL.Open;
  44.     Log(Format('DBJedna pocet vet DPH %d',[FDSQL.Fields[0].AsInteger]));
  45.     FDSQL.Close;
  46.  
  47.     TB2.Close;
  48.     TB2.SQL.Text := 'select count(id) from dph';
  49.     TB2.Prepare;
  50.     TB2.Open;
  51.     Log(Format('DBDva pocet vet DPH  %d',[TB2.Fields[0].AsInteger]));
  52.     TB2.Close;
  53.  
  54.     if FDTran.Active then
  55.       FDTran.Commit;
  56.   except on E: Exception do
  57.     begin
  58.       Log(e.Message);
  59.       if FDTran.Active then
  60.         FDTran.Rollback;
  61.     end;
  62.   end;
  63.   FDConn.Close;
  64.   DB2.Close;
  65.  
Již se to tady řešilo v 2018, ale žádný výsledek to nepřineslo, viz https://forum.delphi.cz/index.php?topic=16387.0
Pokud by však od té doby někdo věděl, jak to vyřešit a používal to, byl bych mu velmi vděčný.
Díky, Karel.
« Poslední změna: 23-09-2022, 08:30:42 od KarelHorky »
Win10 Prof 64b, Firebird 2.5

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3467
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Dvě FDConnection řízené jednou FDTransaction končí chybou
« Odpověď #1 kdy: 23-09-2022, 10:31:20 »
Mozne by to podle vseho melo byt, alespon z pohledu vlastniho Firebirdu:
https://www.wisdomjobs.com/e-university/firebird-tutorial-210/multi-database-transactions-7835.html

Ale jak sdilet jednu transakci na urovni komponent me nenapada, kdyz kazda transakce ma jednu property Connection. Asi bych zkusil ta spojeni otevrit, transakci priradit connection a zahajit ji a zahajenou ji zkusit priradit k druhemu connection. A pokud to nepujde, tak bych se zeptal nekde na SO.

Offline KarelHorky

  • Hrdina
  • ****
  • Příspěvků: 282
  • Karma: 10
    • Verze Delphi: XE6, Delphi 10.2 Tokyo
Re:Dvě FDConnection řízené jednou FDTransaction končí chybou
« Odpověď #2 kdy: 23-09-2022, 12:43:20 »
Ano, Firebird to podporuje, protože s komponentami IBX mi to fungovalo od Delphi 7 a roky také v Delphi XE6.
Tvůj návrh postupného přiřazení již běžící transakce jsem otestoval, ale nemá to žádný vliv, chyba je stále stejná a na stejném místě.
SO jsem prohledával a řešení nenašel, ani nikde jinde. Zkusím se zeptat přímo na SO.
Díky, Karel.
Win10 Prof 64b, Firebird 2.5

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3467
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Dvě FDConnection řízené jednou FDTransaction končí chybou
« Odpověď #3 kdy: 23-09-2022, 13:26:58 »
Ano, Firebird to podporuje, protože s komponentami IBX mi to fungovalo od Delphi 7 a roky také v Delphi XE6.
A tam jsto delal jak? Jak uvadis v tom kodu?

Offline KarelHorky

  • Hrdina
  • ****
  • Příspěvků: 282
  • Karma: 10
    • Verze Delphi: XE6, Delphi 10.2 Tokyo
Re:Dvě FDConnection řízené jednou FDTransaction končí chybou
« Odpověď #4 kdy: 23-09-2022, 14:13:37 »
Mám to použité ve službě a nastavil jsem to jednoduše v designtime. Na datový modul služby jsem umístil dvě komponenty TIBDatabase, jednu TIBTransaction a pár TIBSQL. Všem jsem nastavil tu jednu stejnou transakci a jede to. Nic dalšího se nemuselo nastavovat. Otevřít databáze, zahájit transakci, zadat příkazy pro select z jedné databáze, insert do druhé databáze, potom i z druhé do první, potvrdit transakci, odpojit databáze. Všechno je obaleno blokem try-except, kdyby došlo k chybě, rollbackem transakce se zruší změny v obou databázích.
Tady jsem chtěl ukázat příklad, aby tomu každý rozuměl, případně jednoduše otestoval.
Win10 Prof 64b, Firebird 2.5

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6867
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Dvě FDConnection řízené jednou FDTransaction končí chybou
« Odpověď #5 kdy: 23-09-2022, 14:34:02 »
Ktovie, či niečo nezmenili.
Ja by som použil dve samostatné transakcie. Nie autocommit. Až by boli obe úspešné, tak by som ich potvrdil. Je to jednoduché a priamočiare.
Hm, ja som čosi čítal o tom, že Fb nedokáže pracovať s dvoma DB naraz. Ale ako to presne bolo...
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline KarelHorky

  • Hrdina
  • ****
  • Příspěvků: 282
  • Karma: 10
    • Verze Delphi: XE6, Delphi 10.2 Tokyo
Re:Dvě FDConnection řízené jednou FDTransaction končí chybou
« Odpověď #6 kdy: 23-09-2022, 15:03:05 »
Ja by som použil dve samostatné transakcie. Nie autocommit. Až by boli obe úspešné, tak by som ich potvrdil.
Transakce si řídím sám, žádné Autocommity. Problém je, když už potvrdíš tu první a při potvrzení druhé vznikne chyba. Změny potvrzené tou první už nevrátíš.

Ktovie, či niečo nezmenili.
Ze strany Firebirdu není žádná změna (použito s FB 1.5, 2.0, 2.5). Služba, kterou jsem psal asi v 2010 v D7, pak v 2016 překlopil do DXE6, stále jede bez problémů a na více místech. Na FB 3 nebo vyšší chceme přejít, proto ten FireDAC místo IBX. Nůžky mezi Firebirdem a IBX se stále víc rozevírají, myslím, že IBX si už s FB3 nebudou rozumět.
Win10 Prof 64b, Firebird 2.5

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6867
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Dvě FDConnection řízené jednou FDTransaction končí chybou
« Odpověď #7 kdy: 23-09-2022, 16:28:52 »
Ešte som sa nestretol s tým, aby som mal chybu pri Commit. Vždy to je predtým - xx.FieldByName('y').AsCosi := Nieco, Post, Execute...
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1435
  • Karma: 52
    • Verze Delphi: 10.3
Re:Dvě FDConnection řízené jednou FDTransaction končí chybou
« Odpověď #8 kdy: 25-09-2022, 22:57:52 »
Na FB 3 nebo vyšší chceme přejít, proto ten FireDAC místo IBX. Nůžky mezi Firebirdem a IBX se stále víc rozevírají, myslím, že IBX si už s FB3 nebudou rozumět.

IBX s FB 3 používám bez potíží. Zkoušel jsem i FB 4 - v režimu kompatibility jsem na žádný problém nenarazil, v nativním režimu je potíž v tom, že dotazy vracejí v některých případech jiné datové typy než ty, které v IBX komponentách mám ještě z design time s FB 3.

Pokud by těch rozdílů časem bylo víc, je možné si napsat vlastní rozhraní - stačí vyjít z IBX.IBIntf.pas a doplnit potřebné úpravy (to jsem si vyzkoušel kvůli embedded Firebirdu a IBX pod Androidem - a funguje).

Offline KarelHorky

  • Hrdina
  • ****
  • Příspěvků: 282
  • Karma: 10
    • Verze Delphi: XE6, Delphi 10.2 Tokyo
Re:Dvě FDConnection řízené jednou FDTransaction končí chybou
« Odpověď #9 kdy: 27-09-2022, 10:35:38 »
Dal jsem dotaz na SO a podle odpovědi požadovaná funkčnost s komponentami FireDAC není možná. Firebird má unikátní dvou fázové potvrzování transakcí a to se nedá s FireDAC použít/nastavit. Tož tak.
Win10 Prof 64b, Firebird 2.5

Offline KarelHorky

  • Hrdina
  • ****
  • Příspěvků: 282
  • Karma: 10
    • Verze Delphi: XE6, Delphi 10.2 Tokyo
Re:Dvě FDConnection řízené jednou FDTransaction končí chybou
« Odpověď #10 kdy: 27-09-2022, 10:45:21 »
IBX s FB 3 používám bez potíží.
Základní TIBQuery, TIBSQL, TIBDatabase, TIBTransaction, tady bych problém nehledal. Ale jak jsou na tom serverové komponenty TIBBackupService, TIBRestoreService, TIBValidationService a zejména TIBSecurityService? Umí přidat/opravit uživatele?
Win10 Prof 64b, Firebird 2.5

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1435
  • Karma: 52
    • Verze Delphi: 10.3
Re:Dvě FDConnection řízené jednou FDTransaction končí chybou
« Odpověď #11 kdy: 27-09-2022, 10:55:16 »
Základní TIBQuery, TIBSQL, TIBDatabase, TIBTransaction, tady bych problém nehledal. Ale jak jsou na tom serverové komponenty TIBBackupService, TIBRestoreService, TIBValidationService a zejména TIBSecurityService? Umí přidat/opravit uživatele?

TIBBackupService a TIBRestoreService používám a fungují (u jedné z nich byl nějaký zádrhel v jedné z nedávných verzí Delphi, ale v 11.2 je to v pořádku), ty další dvě nepoužívám, tak nevím. Pro práci s uživateli by ale mělo stačit SQL, ne? https://firebirdsql.org/refdocs/langrefupd25-security-sql-user-mgmt.html

Offline KarelHorky

  • Hrdina
  • ****
  • Příspěvků: 282
  • Karma: 10
    • Verze Delphi: XE6, Delphi 10.2 Tokyo
Re:Dvě FDConnection řízené jednou FDTransaction končí chybou
« Odpověď #12 kdy: 27-09-2022, 11:39:35 »
Já nyní používám i TIBValidationService a TIBSecurityService, tak proto mě zajímá, jaké máš zkušenosti. Takže práce s uživateli by se případně musela přepsat na SQL. OK.
Win10 Prof 64b, Firebird 2.5

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3467
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Dvě FDConnection řízené jednou FDTransaction končí chybou
« Odpověď #13 kdy: 27-09-2022, 12:48:37 »
Dal jsem dotaz na SO a podle odpovědi požadovaná funkčnost s komponentami FireDAC není možná. Firebird má unikátní dvou fázové potvrzování transakcí a to se nedá s FireDAC použít/nastavit. Tož tak.
A obejit ty komponenty a zkusit si transakce ridit na urovni SQL? Mam dojem, ze je tam nejaka klausule USING < DbHandle >, treba by to handle dalo vydolovat z connection a predat ho transakci (nikdy jsem s tim nic nedelal).

Offline KarelHorky

  • Hrdina
  • ****
  • Příspěvků: 282
  • Karma: 10
    • Verze Delphi: XE6, Delphi 10.2 Tokyo
Re:Dvě FDConnection řízené jednou FDTransaction končí chybou
« Odpověď #14 kdy: 27-09-2022, 13:39:36 »
No, tak to je mimo moje možnosti.
Win10 Prof 64b, Firebird 2.5