Bigtable中行不存在则插入的原子实现方案,基于Node.js SDK
Bigtable 行不存在才插入的原子性说明
结论
你当前基于CheckAndMutateRow API的实现具备完全的原子性,可以放心用于仅当行不存在时插入的场景,不会出现并发竞态问题。
原理说明
- Google Cloud Bigtable的
CheckAndMutateRow本身就是单跨行的原子操作:过滤器条件判断、对应分支的修改操作会在服务端一次性完成,全程加行级锁,不会出现判断和操作中间被其他请求修改的情况。 - 你代码中传入空过滤器
filter: []的逻辑是正确的:空过滤器的匹配规则是「行存在任意单元格」,如果该行完全不存在,自然没有匹配结果,就会触发onNoMatch分支的插入逻辑,刚好匹配你“仅指定行不存在时插入”的需求。
你提供的实现代码示例
const row = table.row('phone#4c410523#20190501'); const filter = []; const config = { onNoMatch: [ { method: 'insert', data: { stats_summary: { os_name: 'android', timestamp, }, }, }, ], }; await row.filter(filter, config);
补充提示
如果后续需求调整为「行存在但指定列不存在时才写入」,只需要修改filter数组的匹配规则即可,整个操作依然保持原子性。
内容的提问来源于stack exchange,提问作者Mazout
相关产品推荐
相关产品推荐

