【问题标题】:node js. Sequelize transactions节点js。续集交易
【发布时间】:2017-04-03 20:45:24
【问题描述】:

我的数据库中有 'Banks' 表和 'money' 字段,

用户可以定期取款,但只有在银行存款>0时才能取款。

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

想象一下这种情况,当并发用户尝试提取一些钱时。 在我检查 if(bank.money > amountToWithdraw) 其他用户是否可以执行提款操作的那一刻,数据库中的真实 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});
  })
})

【问题讨论】:

    标签: javascript node.js transactions sequelize.js


    【解决方案1】:

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

    它可能看起来像这样,具体取决于您的数据库。

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

    【讨论】:

    • 你无法理解我花了多少时间寻找一个好的解决方案。我认为文档对事务的使用不是很清楚。你的问题救了我的命!
    • 如何使用两行,例如一行我有10个数量,另外20个,我想减少3并给其他,这样新的数量将是7和23?跨度>
    • 嗨@dinchev,我正在尝试实现事务,但出现错误 TypeError: Sequelize.transaction is not a function
    • 首先,您需要创建一个 sequelize 实例,然后您才能访问事务方法。 @AjendraPrasad
    猜你喜欢
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 2017-01-25
    • 2020-05-15
    • 2017-08-18
    • 1970-01-01
    相关资源
    最近更新 更多