5

pg-promiseを使用して SQL クエリを実行しています。クエリ自体は、外部の .sql ファイルに保存されます。

トランザクションを実行すると、Postgres はエラーが発生すると (予想どおり) トランザクションを中止します。私が実行している問題は、トランザクションが中止された後に実行しようとした別のクエリが実行されず、代わりに次のメッセージが表示されることです: 「現在のトランザクションは中止され、コマンドはトランザクションブロックの終わりまで無視されました」 . クエリが psql コンソールで実行されていた場合、失敗したクエリの後に ROLLBACK を発行することで、この問題を解決できました。アプリケーションで使用される SQL は外部ファイルにあるため、ここではオプションではないと思います。また、何かが失敗した場合はトランザクション全体を破棄する必要があるため、セーブポイントはオプションではないと思います。

このエラーが発生した場合、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

前もって感謝します!

4

1 に答える 1