You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在pg-promise中实现多批量插入的事务回滚?

解决方案:用事务包裹两个批量插入操作

要实现任一批量插入失败时全部回滚,你需要把这两个操作放在同一个数据库事务中。pg-promise提供了tx方法来管理事务,事务内的所有操作要么全部成功提交,要么只要有一个执行失败,就会触发整体回滚。

修改后的代码如下:

const pgp = require('pg-promise')({
    /* initialization options */
    capSQL: true // capitalize all generated SQL
});
const db = pgp(/*connection*/);
 
const cs = new pgp.helpers.ColumnSet(['col_a', 'col_b'], {table: 'tmp'});
const cs2 = new pgp.helpers.ColumnSet(['col_a2', 'col_b2'], {table: 'tmp2'});
    

const values = [{col_a: 'a1', col_b: 'b1'}, {col_a: 'a2', col_b: 'b2'}];
const values2 = [{col_a: 'a1', col_b: 'b1'}, {col_a: 'a2', col_b: 'b2'}];
    

const query = pgp.helpers.insert(values, cs);
const query2 = pgp.helpers.insert(values2, cs2);
    
// 用事务包裹两个操作
await db.tx(async t => {
    await t.none(query);
    await t.none(query2);
});

关键说明:

  • db.tx()会创建一个事务上下文,回调函数中的t是事务专属的数据库操作对象,所有事务内的操作都要通过这个对象执行
  • 只要事务内任意一个操作抛出异常,pg-promise会自动触发事务回滚,之前执行成功的操作也会被撤销
  • 当所有操作都成功完成后,事务会自动提交,无需手动调用提交方法

内容的提问来源于stack exchange,提问作者Ömer Ok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 11:52:12