RxDB中的一個update conflict錯誤情況
阿新 • • 發佈:2020-08-24
最近公司專案中,要使用到RxDB來做前端瀏覽器資料庫做快取,在使用過程中,遇到了更新資料庫時的一個衝突情況。
具體的更新程式碼如下:
const projectsChart = dbController.db.projects; const projectQuery = projectsChart .findOne() .where("originalId") .eq(projectOriginalId); const projectFromDB = await projectQuery.exec(); await projectQuery.update({ $set: { ...resetProjectInfo(projectData), }, });
在一般使用中,這樣的更新方式理論上來講沒有太大的問題,但是因為寫入資料庫需要時間,所以在高頻更新的時候,就會有可能出現更新衝突的情況,具體報錯的資訊如下:
{status: 409, name: "conflict", message: "Document update conflict", error: true}
查閱文件後,發現了另一個更新資料的函式 atomicUpdate,
官方的說明如圖所示,通過函式來直接修改舊值並返回,即可實現資料庫的修改。
所以修改後,新的更新函式可以這麼寫
const changeFunction = (oldData) => { oldData.title = projectData.title; oldData.updatedAt = projectData.updatedAt; return oldData; }; await projectFromDB.atomicUpdate(changeFunction);
經過測試,容易發生更新衝突Document update conflict 也沒有再出現了,問題應該得到了解決。