节点js.续集交易

Igo*_*uan 10 javascript transactions node.js sequelize.js

我的数据库中有'Banks'表和'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});
  })
})
Run Code Online (Sandbox Code Playgroud)

dri*_*hev 26

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

根据您的数据库,它看起来像这样.

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});
  })
})
Run Code Online (Sandbox Code Playgroud)

  • 你无法理解我花了多少时间寻找一个好的解决方案.我认为文档对交易使用情况不是很清楚.你的问题救了我的命! (5认同)