使用mongoose更新依赖字段



目标:我正在创建一个模拟交易,涉及两个账户之间的一定金额的交换。(使用NodeJS服务器和Mongoose)

    | ACCOUNT1   | ACCOUNT2  |   (Account Balance)
--------------------------------
 T1.|    5000    |   2000    |   (initial values)
--------------------------------
 T2.|    3000    |   4000    |   (ACCOUNT1 transfers 2000 to ACCOUNT2)
--------------------------------

问题:问题在于每个事务T1、T2需要两个操作:

  1. 更新帐户1
  2. 更新帐户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});

有更好的方法吗?我可以想到的另一种方法是:

事件发射器方式:

  1. 保存事务日志
  2. 发出事件
  3. 事件处理程序获取事务日志中提到的集合的快照
  4. 更新集合
  5. 如果任何更新失败,请按快照回滚

另请注意,任何交易都可以在未来任何时候删除,必须反映在当前余额中(交易中涉及的金额必须恢复到原始账户)。

一般来说,不要。正如mongoose transaction模块的作者雄辩地说的那样,事务被排除在Mongodb之外是有原因的。

https://www.npmjs.com/package/mongoose-transact

最新更新