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=>{});
即您在本地处理内部事务的结果,而不将其链接到父级。
在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=>{});
即您在本地处理内部事务的结果,而不将其链接到父级。