pg-promise中有没有办法触发一个不会影响外部交易的内部交易?

时间:2017-09-14 22:29:47

标签: node.js postgresql transactions pg-promise

pg-promise我有一种情况,我需要触发一个内部事务,如果需要它可以回滚,这会导致调用事务在出错时回滚:

var db = pgp()(connection);
db.task( function (tk){
  tk.method(/* Logic used to decide if I need to continue */)
  .then( function(data){
    if (!data) return;
    tk.tx( function*(tx){
      // Somewhere in here I need to fire another transaction that I don't care if it fails
      // but I need things to roll back inside of it should it fail
      // without cause this tx to fail
    })
  })
})

到目前为止,我尝试的所有内容都只是导致外部事务(tx)回滚,如果内部事务失败而不是内部事务回滚而外部事务继续使用将要发生的逻辑后。是否有一种可靠的方法可以导致内部事务,如果子事务失败,WON&T引起tx回滚?

作为补充:当我尝试使用Bluebird Promise.some(tx1, tx2)时失败导致tx回滚而另一个tx#失败并回滚也会失败。

1 个答案:

答案 0 :(得分:2)

pg-promise中的所有内容,顾名思义,建立在承诺之上,包括交易逻辑,因此您正在寻找的答案纯粹是与承诺相关的:

如果您不希望内部承诺的结果影响外部承诺,您只是不将该内部承诺链接到父承诺,而是在本地处理/处理它。

对于您的交易,这意味着代替:

tk.tx(function * (t1) {
    return yield t1.tx(function * (t2))
       // chained inner transaction (savepoint)
    });
}).then(data=>{}).catch(error=>{});

你会这样做:

tk.tx(function * (t1) {
    t1.tx(function * (t2))
        // unchained/localized inner transaction (savepoint)
    }).then(data=>{}).catch(error=>{});
}).then(data=>{}).catch(error=>{});

即。您在本地处理内部事务的结果,而不将其链接到父事务。