Postgres автоматически прерывает транзакции всякий раз, когда какой-либо оператор SQL заканчивается ошибкой, которая включает в себя любое нарушение ограничения. Например:
glyph=# create table foo (bar integer, constraint blug check(bar > 5));
CREATE TABLE
glyph=# begin;
BEGIN
glyph=# insert into foo values (10);
INSERT 0 1
glyph=# insert into foo values (1);
ERROR: new row for relation "foo" violates check constraint "blug"
STATEMENT: insert into foo values (1);
ERROR: new row for relation "foo" violates check constraint "blug"
Пока ничего не выдано, но транзакция отменяется. Моя личная любимая строка этого сеанса следующая:
glyph=# commit;
ROLLBACK
... так как "ROLLBACK
" похоже на нечетное сообщение успеха для COMMIT
. Но, действительно, он был откат, и в таблице нет строк:
glyph=# select * from foo;
bar
-----
(0 rows)
Я знаю, что могу создать тонну SAVEPOINT
и обрабатывать ошибки SQL таким образом, но это связано с большим количеством трафика в базе данных, большей задержкой (возможно, мне придется обрабатывать ошибку из SAVEPOINT
), за относительно небольшую выгоду. Я просто хочу обрабатывать ошибку на моем языке приложения в любом случае (Python) с помощью try/except
, поэтому единственное, что я хочу от SQL, - это ошибки, которые не запускают автоматические откаты. Что я могу сделать?