Postgresql捕捉事务错误和回滚

我正在使用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 

先谢谢你!

在外部SQL文件中实现事务时,您需要为COMMITROLLBACK提供所有正确的处理。 如果不这样做,交易状态可能变得不可预知,在您的服务器端代码中,并导致您正在获得的错误types。

这可能有点棘手,说起来容易做起来难。 这就是为什么最好的解决办法是不要这样做。

模块pg-承诺 ,您已经使用提供可靠的处理事务,通过方法tx ,这是你应该使用的。

为此,将你的SQL文件分成两个文件 – 一个用你的DELETE操作,一个用你的UPDATE操作,然后在一个事务中执行它们作为两个查询:

 db.tx(t => { return t.batch([ t.none('DELETE...'), t.any('UPDATE...') ]); }) .then(data => { // success; }) .catch(error => { // error; });