首页 > 解决方案 > 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 块,但line1line2已经执行导致不一致。
有没有一种方法,如果四个动作中的任何一个失败,我可以在不执行任何单个动作的情况下移动到 catch 块。

标签: javascriptfirebasegoogle-cloud-firestore

解决方案


在这种情况下,您需要的是 firestore批量写入,以确保写入之间的原子性,因此您的所有写入都失败或全部成功,不会留下任何数据不一致。

因此,您可以执行以下操作:

const batch = db.batch();

batch.set(ref, {...});
batch.set(ref, {...});
batch.update(ref, {...});
batch.update(ref, {...});

await batch.commit();

请注意,单个批次最多可以包含 500 个写入操作(设置、更新和删除操作)。


推荐阅读