Транзакция в блоке исключений - как?

Может ли какая-то любезная душа указать, где это утверждение неверно, пожалуйста? Я пытаюсь запустить очень простой тест транзакции, но не могу даже запустить оператор. Я пытаюсь запустить его в окне SQL-запросов PG Admin. Других подключений к базе данных нет.

DO $$
BEGIN

START TRANSACTION;

UPDATE IsolationTests SET Col1 = 2;
perform pg_sleep(5.0);

ROLLBACK;

EXCEPTION WHEN division_by_zero THEN
BEGIN
END;

END $$;

Я хочу поиграть с уровнем транзакции и начать и завершить транзакцию в коде. Если я закомментирую "START TRANSACTION" и "ROLLBACK", оценка будет работать нормально. Раскомментируйте их, и я получу

"ERROR:  cannot begin/end transactions in PL/pgSQL
HINT:  Use a BEGIN block with an EXCEPTION clause instead."

Э-э? Это в блоке BEGIN ... EXCEPTION, не так ли?

1 ответ

Отвечая на ваш вопрос - указав, где это утверждение неверно: START TRANSACTION; а не BEGIN заявление в EXCEPTION блок...

Я не уверен, что ты пытаешься сделать. Вот пример отката транзакции (таблица t создана, но не зафиксирована => не существует), но исключение (/0) перехвачено и обработано (повышенная информация):

t=# begin;
BEGIN
Time: 0.124 ms
t=#
t=# DO $$
t$# BEGIN
t$#   begin
t$#     create table t (i int);
t$#   end;
t$#     perform 1/0;
t$# EXCEPTION WHEN division_by_zero THEN
t$#   BEGIN
t$#     raise info '%','exc catched';
t$#   END;
t$#
t$# END;
t$# $$
t-# ;
INFO:  exc catched
DO
Time: 10.288 ms
t=#
t=# rollback;
ROLLBACK
Time: 0.152 ms
t=#
t=# \dt+ t
No matching relations found.
t=# ;
Time: 0.062 ms
Другие вопросы по тегам