簡體   English   中英

對並發API請求的數據庫訪問

[英]Database access for concurrent API requests

如何確保數據庫調用與並發API調用異步?

例如,我有一個代表游泳池的模型。

{
    limit: number e.g 5
    isOpen: boolean // will close when users.length == limit
    users: []
}

我希望在任何給定時間,數據庫中只有1個非全池。 因此,我可以在API調用上運行類似的內容。

let openPool = model.findOne({isOpen: true});
if(!openPool){

    //create a new pool
    model.insert({
        limit: 5,
        users: [currentuser]
        isFull: false
    });
}else{

    //add the current user to existing open pool
    model.update({
        users: {$push: {currentuser}}
    });

    //close pool if full
    if(model.users.length == model.users.limit){
        model.update({
            isOpen: {$set: false}
        });
    }

}

當我同時向該端點發送10個請求時,每個人都認為它們是第一個,然后創建一個新池。 因此,我最終得到了新的10個池,在其中我希望有2個完整(封閉)池,每個池有5個用戶。

有沒有辦法確保所有這些請求都按順序執行?

也許順序地是個壞主意。 但是總的來說,我正在尋找一種方法來保持數據庫狀態始終有效。

Nodejs對此有好處嗎?

任何指向正確方向的指針將不勝感激。

解決方案是使用互斥鎖來同步關鍵塊。
我用了異步鎖

var AsyncLock = require('async-lock');
var lock = new AsyncLock();

requestHandler(){
    return new Promise(async (resolve,reject) => {
        lock.acquire('key', async () => {
           let openPool = await model.findOne({isOpen: true});
           if(!openPool){

           //create a new pool
           await model.insert({
               limit: 5,
               users: [currentuser]
               isFull: false
           });
        }else{
            //add the current user to existing open pool
            await model.update({
                users: {$push: {currentuser}}
            });

            //close pool if full
            if(model.users.length == model.users.limit){
                model.update({
                    isOpen: {$set: false}
                });
            }
        }

        return resolve(true);
    }).then(() => {
        //lock released
    });
}          

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM