1. 程式人生 > 實用技巧 >RxDB中的一個update conflict錯誤情況

RxDB中的一個update conflict錯誤情況

最近公司專案中,要使用到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 也沒有再出現了,問題應該得到了解決。