【发布时间】:2016-11-28 05:38:23
【问题描述】:
我正在使用 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
提前谢谢你!
【问题讨论】:
-
您指的是库pg-promise,但您没有使用它对事务的支持-方法
tx?在这种情况下,我们无法确定发生了什么,因为您没有显示您正在做的事情的完整代码。也许最好使用方法tx,并在其中执行查询,如所有示例所示。见Transactions。这将使您的代码更具可预测性,因为无论如何您都没有在 SQL 中提供正确的ROLLBACK逻辑。
标签: node.js postgresql pg-promise