前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >云开发数据库里规避写覆盖

云开发数据库里规避写覆盖

原创
作者头像
黄希彤
修改2022-01-10 00:16:02
5750
修改2022-01-10 00:16:02
举报
文章被收录于专栏:黄希彤的专栏黄希彤的专栏

一个业务偶然遇到了并发写操作相互覆盖的问题。直觉的想法是能不能加锁?看了一下云开发数据库没有提供锁的接口(当然数据库自己写操作的时候肯定实现了自己的锁)。

那很自然的就想到了,用inc操作维护记录的版本号,加乐观锁来避免误写。不过这样的代价也很大,update操作不能用快速的doc操作来定位记录,而必须用条件查询方式来定位记录,并发写的时候还有可能需要进行多次的重试获取版本并写入直到自己排上队,那要重试几次合适呢?还是得考虑下怎么利用数据库自己的锁机制来避免覆盖。

一个解决办法是把数据放到数组里面,更新数据的时候用push或者unshift来插入数据,这样即使并发写也不会相互写覆盖,但是如果是相同的数据重复写入的话可能数组里面出现重复元素的问题,可能需要处理额外的去重逻辑。

如果想要自动去重,也可以用哈希对象来管理要写入的数据(数据写到key,value如果没有特别需要可以写true或者1之类的简单类型。),然后在用update语句的字段set能力来实现并发更新记录的时候相互不覆盖:

代码语言:javascript
复制
function test(i){
 var answer={};
    answer["answer"+i] = _.set(1);
 return coll.doc(uid).update({answer:answer})
}

尝试一下效果:

代码语言:javascript
复制
var n=100,p=[];
for(var i=0;i<n;i++){
    p.push(test(i))
}
Promise.all(p).then(res=>{
    coll.doc(uid).get().then(res=>{
       console.log(JSON.stringify(res));
    })
})

如果重复的key写入相同的数据,会得到{updated:0}的结果,并不会影响已经写入的数据。

当然如果需要进一步处理重复写入逻辑,也可以吧_.set(1) 改成 _.inc(1) 来记录同一个key被重复写入了多少次。

要留意的是并发数n过大的时候会出现超时。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档