节点js。续集交易

Posted

技术标签:

【中文标题】节点js。续集交易【英文标题】:node js. Sequelize transactions 【发布时间】: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);
  )
)

【问题讨论】:

【参考方案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

以上是关于节点js。续集交易的主要内容,如果未能解决你的问题,请参考以下文章

续集更新交易

如何使用现有钱包签署使用节点 JS 脚本运行的 solana 交易?

如何将交易从元掩码钱包发送到后端节点 js

Web3.js sendSignedTransaction 给出“错误:无法检查交易收据”

发送以太坊交易,Web3.js 没有源地址,但有源私钥?

轻节点如何验证交易的存在