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 也没有再出现了,问题应该得到了解决。

 

posted @ 2020-08-24 14:27  MythosMa_Web  阅读(355)  评论(0)    收藏  举报