Delhi + Frirebird+ Zeos - transaction kérdés

Delhi + Frirebird+ Zeos - transaction kérdés
2008-02-14T15:04:16+01:00
2008-03-03T15:02:34+01:00
2022-11-07T20:15:41+01:00
bengasoft
Sziasztok,

lehet h. már off dolog, mert hasonló problémát már vetettek fel, de a megoldást mindig IB komonenshez adtátok.

A gondom az hogy ha egy kliens módosít valamit a táblán, azt a másik kliens csak akkor látja hogy bezárom és újra indítom. Tehát a modosítás azonnal eltárolódik, de azt a másik nem veszi érszre, csak újracsatlakozás után.

ZeosDb t használok. ZConnection -on az autocommt be van kapcsolva.

klün nem láttam semmi más beállítási lehetőséget trans. kezelésre.

köszi ha segítetek,

Gábor
Mutasd a teljes hozzászólást!
Szia!

Először is a TransactionIsolationLevel=tiReadCommitted; majd én expliciten hívogatnám a Commit, illetve a Rollback utasításokat az adatmanipuláció sikerességének a függvényében. Vagyis pl sikeres Insert után azonnal Commit, etc. De ezzel meg az a baj, hogy akkor a többi adathalmazt nagy valószínűség szerint be fogja zárni, mivel az ő tranzakciójuk is véget ért (Commit-révén). Ezért nem egészséges ez a Connection-nel egybegyúrt egyetlen tranzakció a Zeos részéről. De egy próbát megér. Ha legalább az adatok látszani fognak, az már haladás, de én áttérnék valami rendes FB komponenscsaládra (amíg még nem késő), ami képes egyszerre korlátlan számú explicit TR-t is kezelni, mert ez így elég sovány.

Üdv:Alex
Mutasd a teljes hozzászólást!

  • ez nem tranzakciókezelési, csak frissítési probléma, a kliensnek kell újra lekérdeznie a táblát.
    ezt teheted bizonyos időközönként (pl. Timer), vagy ha a lekérdezés lassú lenne, akkor csinálhatsz egy táblát, amiben van egy flag, amit növelsz, ha módosítod, és a kliens frissítéskor csak ezt kérdezi le, és ha változott, akkor kérdezi le újra a lassú lekérdezést
    Mutasd a teljes hozzászólást!
  • köszi,

    de az a baj hogy frissítés után nem látja
    cask akkor hajlandó látni a máshonnan frissytett adatokat, ha reconnectet csinálok.

    prábáltam más programmal módosítani (fenisql) mondom háta én nem trárok le valamit. de mással mi tuti lezárja, annak amódosytásait se veszi érszre.

    Mutasd a teljes hozzászólást!
  • Milyen tranzakciót használsz, explicitet, vagy implicitet? (A tünetek alapján implicitre gyanaxok.) Továbbá mi a TPB tartalma? Nem tudom ezt Zeos-nál hogyan tudod megnézni, de a tranzakciókomponensnek valami Params, vagy hasonló nevű TStrings típusú property-t kell keresni. Amúgy a frissítés akár az EventManager-en keresztül is mehet, akkor nem kell szekvenciálisan kérdezgetni, hanem az esemény bekövetkeztekor azonnal értesülsz róla és úgy reagálsz rá, ahogyan szeretnéd.

    Szerk: Most látom, hogy a ZConnection implicit tranzakcióját használod. Szerintem ott az AutoCommit azt mondja meg, hogy mi legyen a kapcsolat zárásakor, de ha közben szeretnél kommitot, akkor azt expliciten meg kell hívni, majd újra aktívvá kell tenni a tranzakciót.
    Mutasd a teljes hozzászólást!
  • hello

    elképzelhető h. az autocommit csak kapcsolatbontáskor commitol.

    a propertisbe csak a nyelvi meg a karakteres paraméterek vannak.

    Mutasd a teljes hozzászólást!
  • Igen, azok a kapcsolatra vonatkoznak, de azt sajna nem tudom, hol tárolja a tranzakció paramétereit. Elvileg nekem is fel van téve a Zeos, utánanézek, de addig hátha mond valaki valami okosat!!

    Üdv:Alex
    Mutasd a teljes hozzászólást!
  • elfogytak az öteltek?

    az is segítség lenne, ha valaki tudna modntani valmit, hogy a zeos hogy kezeli a tranzaktiókat. (mert ugye nincs rá külön komponens)

    köszi
    Mutasd a teljes hozzászólást!
  • Szia!

    Először is a TransactionIsolationLevel=tiReadCommitted; majd én expliciten hívogatnám a Commit, illetve a Rollback utasításokat az adatmanipuláció sikerességének a függvényében. Vagyis pl sikeres Insert után azonnal Commit, etc. De ezzel meg az a baj, hogy akkor a többi adathalmazt nagy valószínűség szerint be fogja zárni, mivel az ő tranzakciójuk is véget ért (Commit-révén). Ezért nem egészséges ez a Connection-nel egybegyúrt egyetlen tranzakció a Zeos részéről. De egy próbát megér. Ha legalább az adatok látszani fognak, az már haladás, de én áttérnék valami rendes FB komponenscsaládra (amíg még nem késő), ami képes egyszerre korlátlan számú explicit TR-t is kezelni, mert ez így elég sovány.

    Üdv:Alex
    Mutasd a teljes hozzászólást!
  • Nekem is volt hasonló gondom ilyesmivel, csak én PostgreSQL -t használok ZEOS -al.

    Nekem azt mondták a NAGYOK hogy "..minek azt frissteni..." meg".. tegyél fel egy refresh gombot.."

    Végül az lett a megoldás amit bakter80 is írt kb.
    Kell egy tábla aminek az egyik mezőjében a táblanevek vannak a másikban egy counter.
    Kell egy trigger ami insert update és delete után lefut és emeli ezt a számlálót.
    Az alkalmazás pedig egy timer segítségével megnézi hogy a grid ben megjelenített dataset táblájához volt e tranzakció (változott e a counter értéke) és ha volt akkor requery...

    pg vel így nézett ki a trigger:

    create or replace function trans_counter() returns trigger as $adat$
    begin
    update semaphor set transcount=transcount+1 where tablename=tg_relname;
    return new;
    end;
    $adat$ language plpgsql;

    create trigger trans_counter after insert or update or delete on sqltext
    for each row execute procedure trans_counter();

    create trigger trans_counter after insert or update or delete on diszpok
    for each row execute procedure trans_counter();


    Nem a legszebb megoldás (de tudás hiányában ennyire futotta).. de működött.

    aszamos


    Mutasd a teljes hozzászólást!
  • Köszi a hszólást!

    de talán nem tudtam érthetően megfogalmatzni az én gondomat.

    Nem az a baj, hogy nem frissül autómáatikus a másik kliensban az adat. Hanem h. abszolult nemlátja azokat a módosításokat amik a kapcsolódása óta eredményezett valami más klines.

    szóval. elindul A és B klines. "A" módsosít valamit. Azt "B" addig nem látja amíg újra nemkapcsolódik. Ha az "A" módosított és indok "C" klienst az látja a módosításokt. Meg persze a "B" is ha kilépek és belépek.

    Se queryvel nem látja se table-val. Szóval olyan mint ha valami cache-elt adtokat látna csak.

    Nem lehet h. az FB-m van eléllítva?

    Köszi
    Mutasd a teljes hozzászólást!
  • ... hát akkor sajnos nem tudom
    Talán még ZConnection transaction isolation level property -t kellene megnézni.
    Mutasd a teljes hozzászólást!
  • Mértnem az interbase klienst használod? Fenn van a D. komponenspalettáján. Én ezt használom, és itt van egy TIBTransaction komp., amit rá kell kötni a TIBDatabase komp-ra. aztán a módositás után Transaction.Commit, vagy Transaction.CommitRetaining. Az első bontja a kapcsolatot az AB-sal, a második nem.
    Az ADO-nál is lehet, hogy van vmi hasonló... Én ADO-t csak MSSQL-hez asználok.
    Mutasd a teljes hozzászólást!
  • Isten!

    király lett!

    alapból itNone volt, át állííottam tiReadCommitted re és tökély!

    köszi a segítséget. Mondjuk hasonlóra gondtam én is, csak nem votl egyértelmű ennél a zeosnal hogy mit is takarhat az isolatain level.
    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