如何在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
相关产品推荐
相关产品推荐

