út 6. 7. 2021 v 20:35 odesílatel Michal Páleník
Já jsem se ti jen snažil vysvětlit že je dost užitečný posílat i ten
výstup, chybový hlášky a podobně. Že něco "zblbne" vůbec nepopisuje co
se tam děje. Já jsem kvuli tobě musel lokálně nainstalovat PHP (ač mi
jinak nemůže do systému) abych si to mohl pustit a vidět ten výstup. Z
toho výstupu mi bylo hned jasný o co jde, protože podobná hláška se
vyskytuje v Ruby (asi je to z toho libpq).
Kdybys poslal ten výstup hned, tak si nemusím to PHP instalovat a
rovnou ti napíšu kde je problém. Čím víc konkrétních informací k
problému poskytneš, tím je lehčí pro ostatní zjistit co se tam děje a
tím je větší šance, že ti někdo poradí.
> >
> > Problém je v tom, že ten dotaz padne a tím se v PHP vyvolá vyjímka,
> > kterou by měl programátor odchytit, ošetřit a zavolat ten rollback
> > sám. Jestli si to správně pamatuju, tak ten commit se vůbec nezavolá.
> > První dotaz co padne (i když zavolám v jednom volání toho pg_query víc
> > dotazů a na konci commit) to prostě položí a dál se nepokračuje.
> > Podobně je to v Ruby. Oboje tuším používá libpq, možná je to design
> > převzatý přímo tam.
>
> takže po prvej error to prestane čítať zbytok sql skriptu. ale začne
> čítať ďalší , teda robí zlé veci...
>
> takže asi musím všade kde bol begin pridať aj
> if(strlen( pg_last_error())>2) pg_query('rollback');
Mé chatrné znalosti PHP mi říkají, že tohle není úplně nejlepší nápad.
Správně (alespoň podle helpu [1]) by měl pg_query vrátit false, pokud
se naskytne chyba.
Takže doporučený postup je něco jako:
$result = pg_query("UPDATE ...");
if(!$result) {
// ošetření chyby, třeba ten rollback
}
Ono totiž tu vyjímku na který to padá vyvolá až ten další dotaz,
protože je puštěnej v tý "položený" první transakci.
Ale to už se dostáváme úplně mimo PostgreSQL a přecházíme do PHP.
Můžeš zkusit napsat do PHP maillistu, třeba ti tam poradí líp.
[1]
https://www.php.net/manual/en/function.pg-query.php#example-1912
> alebo to nedávať explicitne do transakcie, lebo to je default v transakcii (When
> multiple statements are passed to the function, they are automatically
> executed as one transaction, unless there are explicit BEGIN/COMMIT
> commands included in the query string. However, using multiple
> transactions in one function call is not recommended. )
>
> nakoniec až tak zlé to nie je.
>
> vďaka za nakopnutie,
> dúfam že môj elaborát niekomu trošku pomohol...
> --
> michal palenik
>
www.freemap.sk
>
www.oma.sk
>
> --
> Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny PostgreSQL-cz ve Skupinách Google.
> Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu
postgresql-c...@googlegroups.com.
> Chcete-li zobrazit tuto diskusi na webu, navštivte
https://groups.google.com/d/msgid/postgresql-cz/YOSibmvbUwgUtmWt%40tanicka.iz.sk.