Я использую pg-prom для запуска моих SQL-запросов. Сами запросы хранятся во внешних файлах .sql.Postgresql Поймать транзакционную ошибку и откат
Когда я выполняю транзакцию, Postgres прервет транзакцию, если произошла ошибка (как и ожидалось). Проблема, с которой я сталкиваюсь, - это любые отдельные запросы, которые я пытаюсь запустить после прекращения транзакции, не запускаются, и я получаю это сообщение: «текущая транзакция прерывается, команды игнорируются до конца транзакционного блока». Если запросы выполнялись в консоли psql, я мог бы решить эту проблему, выпустив ROLLBACK после неудавшегося запроса. Я не думаю, что это вариант здесь, поскольку SQL, используемый моим приложением, находится во внешнем файле. Я также не думаю, что Savepoints являются опцией, потому что вся транзакция должна быть выброшена, если что-то не удастся.
Как я откатился бы в файле SQL, если эта ошибка возникла?
Вот SQL для справки:
BEGIN;
DELETE
FROM tournament_tossup_values
WHERE tournament_id = $1 AND
NOT EXISTS
(
SELECT id
FROM tournament_match
WHERE tournament_id = $1
);
UPDATE tournament
SET bonus_point_value = $5, parts_per_bonus = $6
WHERE id = $1 AND NOT EXISTS (
SELECT id
FROM tournament_match
WHERE tournament_id = $1
)
RETURNING bonus_point_value, parts_per_bonus; <-- Any subsequent accesses to the database by the application fail if this transaction fails
COMMIT; <-- I want to rollback everything if this fails
Спасибо заранее!
Вы ссылаетесь библиотеки [pg-prom] (https://github.com/vitaly-t/pg-promise), но вы не используете его поддержку для транзакций - метод 'tx'? В этом случае мы не можем быть уверены в том, что происходит, поскольку вы не показываете полный код того, что делаете. Возможно, лучше всего использовать метод 'tx' и выполнять запросы в нем, как показано во всех примерах. См. [Транзакции] (https://github.com/vitaly-t/pg-promise#transactions). Это сделает ваш код более предсказуемым, поскольку в любом случае вы не обеспечиваете правильную логику «ROLLBACK» в вашем SQL. –