节点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 交易?