Delphi Firebird deadlock update conflict

Delphi Firebird deadlock update conflict
2022-02-06T22:25:35+01:00
2022-02-07T07:58:21+01:00
2022-12-07T00:20:40+01:00
csanesz
Sziasztok!

Delphi7-ben íródott az alkalmazásom.
Firebird adatbázist használ, InterBase komponenseken keresztül.

Van egy tábla az adatbázisba, azt írná a program. Ez helyi gépen tök jól működik, viszont hálózatban, már dobálja a deadlock update coflict hibaüzenetet.

Van a táblához egy IBSQL (törlés, lekérdezés) és egy IBDataSet (megjelenítés, módosítás, törlés, írás) komponens.
A DBGridhez az IBDataset van hozzákötve.

Hogy állítsam be az IBTransaction komponenst, hogy hálózatos felhasználásnál ne akadjon össze?
Eddig Snapshot ra volt állítva (concurrency, wait).

100%-hogy lesz olyan eset, hogy ugyan az a rekord lesz egy időben módosítva.
Ilyenkor a wait kell, azt tudom, de kérdés, hogy ebben az esetben, a tranzakciónak lehet tudni a várakozási idejét? Nem fog emiatt a másik program végtelenségig várakozni?

Köszönöm!
Mutasd a teljes hozzászólást!
1. A szabvány IBX komponenseknél inkább a Read_Committed (rec_version, nowait) -re állítanám helyedben a TIBTransection componenst. (Dupla klikk az ikonon)

wait- et NE használj vele, mert "végtelen". Nincs időzíthetősége.

2. Én évek óta írom át az összes SQL utasítást egyenként inkább az újabb kedvencemre:
 UIB (Unified InterBase)

Itt ugyanis (a mikroszekundumok kezelése mellett) lehetőség van beállítani LockTime-ot:

function TFrm_webSzerver.DB_Vegrehajt_web(sql:string) : Boolean; const c_uTr_TimeOut_Read = [tpConcurrency, tpWait, tpRead , tpLockTimeout]; c_uTr_TimeOut_Write = [tpConcurrency, tpWait, tpWrite, tpLockTimeout]; var DB : TUIBDatabase; TR : TUIBTransaction; begin DB := TUIBDataBase.Create(nil); TR := TUIBTransaction.Create(DB); TR.Options := c_uTr_TimeOut_Write; TR.LockTimeout := 3; TR.DefaultAction := etmRollback; TR.DataBase := DB; DB.Params.Text := c_db_params; //'sql_dialect=3'#13'lc_ctype=WIN1250'#13'user_name=SYSDBA'#13'password=masterkey'; DB.DatabaseName := database_path; DB.LibraryName := fbClientDLL; try TR.AutoStart := True; TR.AutoStop := True; DB.Connected := True; TR.ExecuteImmediate(sql); TR.Commit; Result := True; except Result := False; end; TR.free; DB.Free; end;
Mutasd a teljes hozzászólást!

  • Szia!

    Bocsi, már késő volt, amikor írtam a bejegyzést, emiatt elírtam nem a wait-et használtam, hanem a nowait-et.
    Kipróbáltam amit írtál.
    1./ Ha a Read Committed-re állítom (read_committed, rec_version, nowait), akkor ugyan annál a rekordnál történő módosításnál dobja a confilctet, és a lock-ot is.
    2./ Ha úgy állítom be, ahogy írtad (rec_version, nowait), akkor el sem indul a program, mivel Transaction not active hibaüzenettel leáll.
    Mutasd a teljes hozzászólást!
  • Szia!

    Bocsi, közben megoldódott, szerintem idegességemben, már mindent csináltam, és valamiért az IBSQL2, IBDataSet2 eltűnt a hozzárendelt IBTransaction2. Ha beállítottam, Read Commited-re, ahogy írtad, akkor most már jól múködik, nem akad össze!

    Köszi a segítséget!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd