2017-09-14 88 views
2

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)回滾。如果子事務失敗,是否有可靠的方法導致內部事務不會導致tx回滾?

作爲補充:當我嘗試使用BluebirdPromise.some(tx1, tx2)作爲失敗原因tx回滾而其他tx#失敗並回滾時也失敗。內pg-promise

回答

2

一切,顧名思義,建在承諾,包括事務邏輯,所以你正在尋找的答案是純粹的承諾有關:

如果你不希望內部的結果承諾會影響外部承諾,您只需將內部承諾鏈接到父級,就可以在本地處理/處理它。

爲您的交易,這意味着不是這樣:

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

即你在本地處理從內部交易的結果,如果沒有它鏈接到父母。

+0

我很好奇,如果是因爲我們被鎖定到pg-promise的舊版本。我將檢查github上的提交歷史記錄以及可能的解決方案。 –

+1

@RobertMennell可能是因爲你在混合使用ES6生成器,那些可能會很棘手,容易犯錯誤,你應該或不應該使用'yield';) –

+0

謝謝指出!沒有想到這一點,但對每個追隨我的人都會有所幫助 –

相關問題