2016-11-20 99 views
3

我在我的數據庫中有'錢'字段的'銀行'表,節點js。續訂交易

用戶可以定期提款,但只有在銀行存款> 0時纔可以提款。

首先,我應該得到銀行的實體,然後檢查是否(銀行。貨幣> amountToWithdraw),然後撤回此金額。

想象一下當併發用戶試圖提取一些錢時的情況。 在那個時候我檢查是否(bank.money> amountToWithdraw)其他用戶可以執行提取操作,並且數據庫中的真實銀行金額會更少。

如何將交易應用於查找銀行操作(如何鎖定銀行實體)?

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

回答

8

您可以在銀行的行上使用鎖定。

它可以看起來像這樣,取決於你的數據庫。

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}); 
    }) 
}) 
+2

你無法理解我花了多少時間尋找一個好的解決方案。我認爲文檔不太清楚交易使用情況。你的問題拯救了我的生命! –

+0

如何使用兩行,例如在一行中我有數量10,在其他20,我想減少3,並給其他,所以新的數量將是7和23? – user1735921