データベースに「money」フィールドを含む「Banks」テーブルがあります。
ユーザーは定期的にお金を引き出すことができますが、銀行に0を超えるお金がある場合にのみ引き出すことができます。
最初に銀行のエンティティを取得し、次にif(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});
})
})
銀行の列のロックを使用できます。
データベースによっては、次のようになります。
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});
})
})