Autor Téma: Table.Delete OK, Table.Post NIE  (Přečteno 2147 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5777
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Table.Delete OK, Table.Post NIE
« kdy: 20-10-2020, 21:46:09 »
Včera som celý blažený išiel spať. Vkladanie záznamov OK. A dnes takýto šok. Ja začnem veriť, že som naozaj zakliaty, alebo som ... Jaj to už dávno viem, že som.  Skúšam najjednoduchší prípad - práca priamo s jedinou tabuľkou.
  • Table.Delete - OK. Vymaže záznam
  • Table.Insert, Edit - OK
  • Následný Table.Post prejde, ale v tabuľke nie je žiadna zmena
  • Používa sa tá istá transakcia
  • UpdateTransaction.Isolation = xiReadCommitted
  • ReadOnly = False
Všetko viacnásobne skontrolované. Včera som mal xiUnspecified, čo je vraj xiReadCommitted. Začalo to fungovať, až keď som to zmenil na xiReadCommitted.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 398
  • Karma: 9
    • Verze Delphi: XE2
Re:Table.Delete OK, Table.Post NIE
« Odpověď #1 kdy: 20-10-2020, 21:56:12 »
Všetko viacnásobne skontrolované. Včera som mal xiUnspecified, čo je vraj xiReadCommitted.
Zkus někdy Google  - zabere to asi 8 sekund ..
http://docwiki.embarcadero.com/Libraries/Sydney/en/FireDAC.Stan.Option.TFDTxOptions.Isolation

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5777
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Table.Delete OK, Table.Post NIE
« Odpověď #2 kdy: 20-10-2020, 22:02:04 »
Ale na FB som čítal, čo som napísal. Ak som to nepoplietol.
Ale to nič nemení na veci, keďže mám nastavené xiReadCommitted. Vyskúšal som aj xiDirty čo je prakticky nulová izolácia. Rovnaký výsledok.
Na tom internete som si to všetko prešiel. FireDAC aj FB.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5777
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Table.Delete OK, Table.Post NIE
« Odpověď #3 kdy: 20-10-2020, 22:16:14 »
Tak som na dôvod prišiel. Transakcia je aktívna a ja som ju spúšťal ešte raz. Keď som urobil Rollback, tak to je OK.
Narýchlo som hľadal, kde to spúšťam, ale som to nenašiel. Nevadí, budem krokovať.
Teda robí chyby čo ich je naozaj problém objaviť.
.
Ospravedlňujem sa zbytočné zahlcovanie webu.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 398
  • Karma: 9
    • Verze Delphi: XE2
Re:Table.Delete OK, Table.Post NIE
« Odpověď #4 kdy: 20-10-2020, 22:17:37 »
Ale na FB som čítal, čo som napísal. Ak som to nepoplietol.

No  nevím co řešíš, ale to co TFDTxOptions.Isolation řeší je jak tvá aktuální transakce přistupuje k ostatním transakcím (viditelnost)
a na to jestli to něco (ne)ukládá  ve tvé transakci by nemělo mít vliv (snad jen konkureční zápisy).
doporučuji knihu od Pavla Císaře Interbase/Firebird 

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3213
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Table.Delete OK, Table.Post NIE
« Odpověď #5 kdy: 20-10-2020, 22:18:52 »
Skúšam najjednoduchší prípad - práca priamo s jedinou tabuľkou.
Jako 1. krok se vykasli na UpdateTransaction a pouzij jen jednu ReadCommited RW transakci.
Jako 2. krok, kdyz to stale nebude videt si dej bkpt po commit a podivej se vedle z nejakeho SQL Manageru na obsah DB, jestli je to opravdu commitnute.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3213
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Table.Delete OK, Table.Post NIE
« Odpověď #6 kdy: 20-10-2020, 22:37:45 »
Narýchlo som hľadal, kde to spúšťam, ale som to nenašiel. Nevadí, budem krokovať.
No tu transakci nejspis nastartuje ten automaticky rezim jeste pred tim, nez bys ho pripadne vypnul tim StartTransaction (pokud se to tedy u FD vubec vypina).

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5777
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Table.Delete OK, Table.Post NIE
« Odpověď #7 kdy: 20-10-2020, 23:50:23 »
Nie. Spúšťam ich sám. Ale používal som Close/FreeAndNil a to neuzatvorí transakciu. Takže to musím celé prejsť. Len teraz vidím, koľko otvorených transakcií mi viselo vo vzduchu.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 398
  • Karma: 9
    • Verze Delphi: XE2
Re:Table.Delete OK, Table.Post NIE
« Odpověď #8 kdy: 21-10-2020, 00:42:02 »
Jako 1. krok se vykasli na UpdateTransaction a pouzij jen jednu ReadCommited RW transakci.
Jako 2. krok, kdyz to stale nebude videt si dej bkpt po commit a podivej se vedle z nejakeho SQL Manageru na obsah DB, jestli je to opravdu commitnute.

Při testovaní bych to ponechal, ale při ostrém provozu bych se radši držel zásady transakce RW   bych držel aktivní pouze po dobu vlastního zapisu a pak deaktivovat
(což není commit ani rollback) a pro prohlížení dat a tisk vytvařet pouze Read only transakce .
Já používám  transakce níže uvedeným systémem a mám jistotu že mi nikde žadná transakce nezustane viset.

Kód: [Vybrat]
  function GetPocetKatastru: Integer;
var
  Q1: TpFibQuery;
  i: Integer;
  ASQL: string;
  IBTransactionV: TpFIBTransaction;

  begin
  Result := 0;
  ASQL := Format('SELECT COUNT(*) FROM KATASTR ', []);
  i := 0;
  VytvorCteciTransakci(IBTransactionV);
  Q1 := TpFibQuery.Create(nil);
  try
    try
      Q1.Database := DM1.pFIBDatabase1;
      Q1.Close;
      Q1.Transaction := IBTransactionV;

      if not Q1.Transaction.Active then       Q1.Transaction.StartTransaction;

      Q1.SQL.Add(ASQL);
      Q1.ExecQuery;
      Result := Q1.FieldByName('COUNT').AsInteger;
      Q1.Close;

    except
    {$I 'fibq-except.inc'}
    end;

  finally
    FreeAndNil(IBTransactionV);
    FreeAndNil(Q1);
  end;
end;


Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 196
  • Karma: 2
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Table.Delete OK, Table.Post NIE
« Odpověď #9 kdy: 21-10-2020, 06:54:09 »
Excellent
Rated 1 time
To je samozřejmě tak, jak by se proti SQL serveru pracovat mělo. Ale on nepoužívá SQL, ale pracuje s Table.
Takže má otevřenou transakci od okamžiku, kdy zavolá edit, až po post (uživatel začne editovat a odskočí si na oběd).
Na problémy narazí v okamžiku, kdy bude ctít používat víceuživatelský přístup, uživatelé si budou zamykat záznamy/tabulky, začne řešit, proč mu tam vznikají deadlocky.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3213
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Table.Delete OK, Table.Post NIE
« Odpověď #10 kdy: 21-10-2020, 07:56:30 »
Nie. Spúšťam ich sám. Ale používal som Close/FreeAndNil a to neuzatvorí transakciu. Takže to musím celé prejsť. Len teraz vidím, koľko otvorených transakcií mi viselo vo vzduchu.
No to jsem myslel, ze uz jsi vyresil nekdy pred tydnem, nebo kdy to bylo  :o

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5777
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Table.Delete OK, Table.Post NIE
« Odpověď #11 kdy: 21-10-2020, 09:29:48 »
Citace
No to jsem myslel, ze uz jsi vyresil nekdy pred tydnem, nebo kdy to bylo 
To je pravda. Ale vtedy som mal 3 transakcie. Teraz pre SQL používam len jedinú - manual a problém bol znovu na svete.
Citace
To je samozřejmě tak, jak by se proti SQL serveru pracovat mělo. Ale on nepoužívá SQL, ale pracuje s Table.
Takže má otevřenou transakci od okamžiku, kdy zavolá edit, až po post (uživatel začne editovat a odskočí si na oběd).
Na problémy narazí v okamžiku, kdy bude ctít používat víceuživatelský přístup, uživatelé si budou zamykat záznamy/tabulky, začne řešit, proč mu tam vznikají deadlocky.
Ja mám Table jedine kvôli DB komponentom. Ináč vždy všade používam Query. FB zamykanie záznamov (asi ani tabuliek) nemá. K jednému SVB má prístup len jediný užívateľ. Takže konkurenčný prístup nehrozí.
To Jirka: ja som si myslel, že spojenie/transakciu s DB treba stále držať nažive. Že to má vysokú réžiu a podobné úvahy. Prerobím to podľa Tvojho príkladu. Pod výrazom "visia mi transakcie" som mal na mysli, že sú stále aktívne.
  • Table - budú mať trvalé pripojenie k DB. V rámci životnosti
  • Query - len v čase aktivity
Ďakujem za kód :-* (iný vhodný smieško tu nie je). Tie zásady som si nemal kde prečítať.
Edit:
DB grid nepoužívam. Pôvodne som to mal bez DB komponentov. Už si nepamätám na dôvod zmeny. Ale tu na tom webe je spomenutý.

« Poslední změna: 21-10-2020, 09:38:27 od Stanislav Hruška »
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Jirka

  • Hrdina
  • ****
  • Příspěvků: 398
  • Karma: 9
    • Verze Delphi: XE2
Re:Table.Delete OK, Table.Post NIE
« Odpověď #12 kdy: 21-10-2020, 09:39:38 »
To je samozřejmě tak, jak by se proti SQL serveru pracovat mělo. Ale on nepoužívá SQL, ale pracuje s Table.
Já to posílal jako princip jak se nejlepe vyhnout zatoulaným a neuvolněným transakcím. 
Reagoval jsem na postup pf  aby se používala jedna RW  transakce  na prohlížení i editaci
Nehledě na to že používání Table mi přijde minimálně jsko problematické - například při vytváření kopie dokladu Master/Detail

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 196
  • Karma: 2
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Table.Delete OK, Table.Post NIE
« Odpověď #13 kdy: 21-10-2020, 09:45:11 »
To Jirka: ja som si myslel, že spojenie/transakciu s DB treba stále držať nažive. Že to má vysokú réžiu a podobné úvahy.

To platí o spojení (Connection) - to si držíš po běh programu. Transakce naopak zahajuješ a potvrzuješ po co nejkratší nutnou dobu.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5777
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Table.Delete OK, Table.Post NIE
« Odpověď #14 kdy: 21-10-2020, 09:51:56 »
To Jirka: ja som si myslel, že spojenie/transakciu s DB treba stále držať nažive. Že to má vysokú réžiu a podobné úvahy.
To platí o spojení (Connection) - to si držíš po běh programu. Transakce naopak zahajuješ a potvrzuješ po co nejkratší nutnou dobu.
Teraz to tak prerábam. Jirka v príklade stále vytvára a ničí transakcie. To ma zaskočilo. Ale ako písal, je tu 100 % istota.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.