web-dev-qa-db-ja.com

ノードjs。トランザクションの逐次化

データベースに「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});
  })
})
10
Igor Kasuan

銀行の列のロックを使用できます。

データベースによっては、次のようになります。

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