我正在开发一个项目,其中包括一个“跟随”“和”,取消“”功能,就像社交媒体应用程序一样。每次用户跟踪或取消跟踪时,都会为这两个功能运行四个不同的操作。
假设,对于下面的特性,我有以下代码:
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,造成了不一致性。
是一种方法,如果这四个操作中的任何一个失败,我可以移动到捕捉块而不执行任何一个操作。
发布于 2021-02-14 17:43:40
在这种情况下,您需要的是确保跨写原子性的防火墙批写,所以您的所有写操作要么都失败了,要么它们都成功地没有留下任何数据不一致的地方。
所以你可以做这样的事情:
const batch = db.batch();
batch.set(ref, {...});
batch.set(ref, {...});
batch.update(ref, {...});
batch.update(ref, {...});
await batch.commit();请注意,一个批处理最多可以包含500个写操作(设置、更新和删除操作)。
https://stackoverflow.com/questions/66198110
复制相似问题