Query error=Implicit ABORT?

Поиск
Список
Период
Сортировка
От Eric D Nielsen
Тема Query error=Implicit ABORT?
Дата
Msg-id 200305241556.LAA27520@magic-pi-ball.mit.edu
обсуждение исходный текст
Ответы Re: Query error=Implicit ABORT?  ("Wayne Armstrong" <wdarmst@bacchus.com.au>)
Список pgsql-general
If in a transaction block, one of the queries generates an ERROR
then the transaction is aborted prior to a COMMIT/ROLLBACK being ordered,
but still requires a COMMIT/ROLLBACK to officially end the transaction.

I was expecting to have to programmaticly check for the error(s) and either
attempt to fix the issue or explicitly ROLLBACK.   While the behavoir
is extremely convienent for simple transactions, it seems to create a great
deal of extra work in cases where you want to try to recover from error rather
that aborting.  To do so now, I would have to
1) issue query
2) check for error
  No Error) save the query to some log
  Error) issue the explict rollback to end the transaction
         program logic to recover
         start new transaction
         issue all saved query from the log
         issue recovered version of query

This is a fair bit of work.  However, I do realize that its rarely needed.
If its possible to programmatically recover from an error, its
should be possible to detect the error in advance 99.9% of the time and
avoid generating the error in the first place.  However, in cases where errors
are very rarely expected, and testing for errors in advance is a performance
issue, the above pattern would seem to be appropriate.  Is there a way to
disable the implict abort when it makes sense?

This behavoir is alluded to in the docs, but not stated explicity; it is
raised directly in one of the user-provided notes on BEGIN and is noted
to be at odds with other DBMS's. Can this behavoir be counted on for the
forseeable future versions of PostGreSQL?

--- begin demonstration script ---
CREATE TABLE foo (
  bar int primary key,
  baz int
);
BEGIN WORK;
INSERT INTO foo (bar,baz) VALUES (1,2);
SELECT joe FROM foo;
COMMIT WORK;
SELECT * FROM foo;
--- end demonstration script ---

Flipping the INSERT/SELECT in the transaction block raises the NOTICE
referenced in the subject line and clued me in to what was happening.

Thank you.
Eric Nielsen

В списке pgsql-general по дате отправления:

Предыдущее
От: "Wayne Armstrong"
Дата:
Сообщение: Automatic error rollback can be harmful
Следующее
От: "Dean K. Gibson"
Дата:
Сообщение: Re: Subqueries and the optimizer