javascript - Firebase Firestore 数据不一致
问题描述
我正在开发一个项目,该项目由“关注”和“取消关注”功能组成,就像社交媒体应用程序一样。每次用户关注或取消关注时,都会针对这两个功能运行四个不同的操作。
假设,对于以下功能,我有以下代码,
export const followUser = async (profile)=>{
try{
await db.collection('_').doc('_').set({...}); //line 1
await db.collection('_').doc('_').set({...}); //line 2
await db.collection('_').doc('_').update({...}); //line 3
await db.collection('_').doc('_').update({...}); //line 4
}
catch(error){
throw error;
}
}
我发现由于某种原因可能存在数据不一致,如果line3失败,它将进入 catch 块,但line1和line2已经执行导致不一致。
有没有一种方法,如果四个动作中的任何一个失败,我可以在不执行任何单个动作的情况下移动到 catch 块。
解决方案
在这种情况下,您需要的是 firestore批量写入,以确保写入之间的原子性,因此您的所有写入都失败或全部成功,不会留下任何数据不一致。
因此,您可以执行以下操作:
const batch = db.batch();
batch.set(ref, {...});
batch.set(ref, {...});
batch.update(ref, {...});
batch.update(ref, {...});
await batch.commit();
请注意,单个批次最多可以包含 500 个写入操作(设置、更新和删除操作)。
推荐阅读
- maven - docker 使用 config-map 变量运行
- javascript - 允许使用 Array.from 将数据结构转换为数组
- r - 在循环中,我无法将数值附加到最初为空的向量。我可以通过控制台做到这一点
- python - 如何在三个字段上使用 partitionby 配对字段中的所有值
- rabbitmq - RabbiMQ stomp 自动删除队列 - 前提条件失败
- java - 在元素描述中使用变量值
- php - 这个 foreach 适合向数据库添加文本还是我使用了错误的方法?
- sql - 获取 MariaDB 的正确 SQL 查询语法
- haxe - 双击我的 hxml 文件时如何恢复“编译”?
- android - 当我点击按钮时如何在android中配置按钮它会改变它的颜色&点击后它会变成默认(以前的)颜色