我有一個REST API,它會一個接一個地執行一系列異步任務。代碼如下所示:在Node.js中鎖定承諾鏈接
asyncFunc1()
.then(asyncFunc2())
.then(asyncFunc3())
.then(asyncFunc4())
第一步將執行一些數據庫查詢,最後一步將更新數據庫。當然(因爲我來自java/c + +背景),我會在我的承諾鏈的開頭添加一個鎖,以確保與數據庫的交互受到保護。
但我是新來的Node.js和它的異步處理單線程模式困惑我在這裏。因此,我應該在每個涉及數據庫操作的步驟中添加一個鎖,在我的承諾鏈的開頭鏈接或添加鎖,或者我根本不需要鎖?
-------- ---------更新
正如一位評論和答覆指出了這一點,我寫我的錯鏈(我的實際代碼是正確的,雖然,只是一個簽署表明我是新來的Node.js:$)
asyncFunc1()
.then(asyncFunc2)
.then(asyncFunc3)
.then(asyncFunc4)
其實我在我的鏈的開頭使用Redlock,我不知道這是一個好主意。拉胡爾辛格提供的答案表明我不需要鎖定!
什麼抵抗鎖定後衛? – stone
首先,你的連鎖店是錯誤的。它應該是'asyncFunc1()。then(asyncFunc2).then(asyncFunc3)'等等...傳遞函數引用 - 不要先調用它們並傳遞返回結果。 – jfriend00
具有故意排序的命令的單線程模式不應該針對該代碼序列進行數據庫鎖定。但是,如果有其他請求可能同時運行,那麼如何處理數據庫更新以避免併發問題完全取決於您的代碼正在執行的操作以及數據庫的工作方式。對於鎖沒有通用要求,但是對於數據庫來說,讀取某些內容,修改內容並將其寫回等操作可能需要以某種方式受到來自其他請求的競爭條件的保護,這些請求也使用數據庫。 – jfriend00