节点js。续集交易

时间:2016-11-20 11:33:20

标签: javascript node.js transactions sequelize.js

我有'班克斯'表' money'我的数据库中的字段,

用户可以定期提款,但只有在有钱的情况下才可以提款。在银行里0。

首先我应该获得银行的实体,然后检查是否(bank.money> amountToWithdraw)然后提取这笔金额。

想象一下当并发用户试图提取一些钱时的情况。 在那一刻,当我检查(bank.money> amountToWithdraw)其他用户是否可以执行提款操作时,DB中的实际bank.money金额将会减少。

如何将交易应用于查找银行业务(如何锁定银行实体)?

models.sequelize.transaction(function (t) {

return models.Banks.findOne({where: {
    money: {
      $gt: 0
    }
  }).then(function(bank){

    //in this moment other user finished the same operation
// how to lock access for editing bank object by other users after //findOne method?

    bank.money -= amountToWithdraw;
    return bank.save({transaction: t});
  })
})

1 个答案:

答案 0 :(得分:17)

您可以在银行的行上使用锁定。

根据您的数据库,它可能看起来像这样。

models.sequelize.transaction(function (t) {

return models.Banks.findOne({where: {
       money: {
         $gt: 0
       }
    }, lock: t.LOCK.UPDATE, transaction: t }).then(function(bank){

    bank.money -= amountToWithdraw;
    return bank.save({transaction: t});
  })
})