dve transakcie po sebe

5 views
Skip to first unread message

Michal Páleník

unread,
Jul 6, 2021, 7:50:52 AM7/6/21
to postgr...@googlegroups.com
ahojte

ak mám transakcie typu (v jednej session):
begin;
sql1;
commit;
begin;
sql2;
commit;

a v sql1 niečo zblbne (typicky keď sa snažím napchať text do int), tak
druhý sq2 sa ani nepokúsi urobiť.

čo s tým?

začal som dávať
begin; sql1; commit; rollback; begin;...
vďaka čomu sql2 zbehne (iba ten rollback trochu nadáva)

extra odchytávať či bol nejaký error sa mi nechce (robím to cez
`cat subor.sql | psql`)

nejaké super riešenie máte?


--
michal palenik
www.freemap.sk
www.oma.sk

Tomas Vondra

unread,
Jul 6, 2021, 7:57:50 AM7/6/21
to postgr...@googlegroups.com, Michal Páleník
Ale to je divne ze se vam ta druha transakce neprovede, pokud to
poustite takhle pres psql. Protoze by default to udela tohle:

BEGIN
ERROR:  invalid input syntax for type integer: "z"
LINE 1: insert into t values ('z');
                              ^
ROLLBACK
BEGIN
INSERT 0 1
COMMIT

Tj. ten prvni commit se zmeni na rollback a ta druha transakce projde.
Nemate tam nejak prenastavene prostredi pres .psqlrc nebo tak neco?
Konkretne asi volby

- ON_ERROR_ROLLBACK
- ON_ERROR_STOP


T.

Michal Páleník

unread,
Jul 6, 2021, 9:04:38 AM7/6/21
to postgr...@googlegroups.com
pozerám bližšie a púšťam to cez php.

v prílohe .sql a .php súbory

ak urobím `cat test.sql|psql mapnik` tak zbehne (a trošku nadáva)

ak to volám cez php, tak zblbne a druhá časť neprebehne. aj keď je cez dve pg_query()



>
>
> T.
>
> --
> 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/e33781c1-9d67-749e-b351-399151ea79c5%40gmail.com.
test.sql
t.php

Josef Šimánek

unread,
Jul 6, 2021, 9:22:50 AM7/6/21
to postgr...@googlegroups.com
út 6. 7. 2021 v 15:04 odesílatel Michal Páleník
<michal....@freemap.sk> napsal:
Ono z toho že něco "zblbne" se nedá moc odhadnout co se tam děje. Já
jsem si to teda zkusil pustit a tady je výstup
(https://gist.github.com/simi/1cb04f8df13693a8445ef1ebc5504c46, příště
radím rovnou přiložit k první zprávě).

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.

>
>
> >
> >
> > T.
> >
> > --
> > 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/e33781c1-9d67-749e-b351-399151ea79c5%40gmail.com.
>
> --
> 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/YORU3UDjFSQ7yCgs%40tanicka.iz.sk.

Michal Páleník

unread,
Jul 6, 2021, 2:35:35 PM7/6/21
to postgr...@googlegroups.com
"zblbne", že celé pokazí a na konci nie je v tabuľke hodnota 3 ale
tabuľka je prázdna.

>
> 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');

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...

Josef Šimánek

unread,
Jul 7, 2021, 3:46:58 AM7/7/21
to postgr...@googlegroups.com
ú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.
Reply all
Reply to author
Forward
0 new messages