pg-promise 中有没有办法触发不会影响外部事务的内部事务?

Is there a way in pg-promise to trigger an inner transaction that won't affect the outer transaction?

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) 回滚,而不是内部事务回滚并且外部事务继续执行将要出现的逻辑后。如果子事务失败,是否有一种可靠的方法来导致不会导致 tx 回滚的内部事务?

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

pg-promise中的一切,顾名思义,都是建立在承诺之上的,包括交易逻辑,所以你要找的答案纯粹是与承诺相关的:

如果您不希望内部 promise 的结果影响外部 promise,您只需不将该内部 promise 链接到父级,而是 process/handle 在本地。

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

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=>{});

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