目标:我正在创建一个模拟交易,涉及两个账户之间的一定金额的交换。(使用NodeJS服务器和Mongoose)
| ACCOUNT1 | ACCOUNT2 | (Account Balance)
--------------------------------
T1.| 5000 | 2000 | (initial values)
--------------------------------
T2.| 3000 | 4000 | (ACCOUNT1 transfers 2000 to ACCOUNT2)
--------------------------------
问题:问题在于每个事务T1、T2需要两个操作:
- 更新帐户1
- 更新帐户2
这两种情况中的任何一种都会导致另一个回滚
当前方法:
// save transaction log.then(function(data){
AccountHelper.updateAccount(accountOwner, fromAccount, amount)
.then(function(data){
AccountHelper.updateAccount(accountOwner, fromAccount, amount)
.then(function(data){
//some success response
}).catch(function(err){
// rollback the previous update
// respond with the err
});
})
.catch(function(err){
// respond with the err
});
//}).catch(function(err){ respond with the err});
有更好的方法吗?我可以想到的另一种方法是:
事件发射器方式:
- 保存事务日志
- 发出事件
- 事件处理程序获取事务日志中提到的集合的快照
- 更新集合
- 如果任何更新失败,请按快照回滚
另请注意,任何交易都可以在未来任何时候删除,必须反映在当前余额中(交易中涉及的金额必须恢复到原始账户)。
一般来说,不要。正如mongoose transaction模块的作者雄辩地说的那样,事务被排除在Mongodb之外是有原因的。
https://www.npmjs.com/package/mongoose-transact