我有'班克斯'表' 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});
})
})
答案 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});
})
})