如何处理多个数据库调用的事务回滚(调用firebase和mongoDB Atlas)



下面是我的场景:

  1. 我有一个Firebase数据库
  2. 我还有一个MongoDB Atlas数据库
  3. 有一种情况,我必须向MongoDB Atlas数据库中的集合写入,然后再向Firebase数据库中的一个集合写入,最后完成向MongoDB阿特拉斯数据库的回写

我就是这样处理的:

  1. 我启动一个MongoDB事务
  2. 我执行对MongoDB的写入(如果失败,我可以回滚而不出现问题(
  3. 我执行对Firebase的写入(如果失败,我仍然可以取消MongoDB提交和回滚(
  4. 我对MongoDB进行了另一次最后的编写(ISSUE HERE(
  5. 然后我提交MongoDB事务(ISSUE HERE(

如您所见,在第4点和第5点中,如果操作失败,则可以回滚对MongoDB的写入,但不能回滚对Firebase的写入。显然,因为这两个数据库没有链接,也不在同一个系统下。如何处理这一问题?我相信有很多系统都有多个数据库。

我正在使用NodeJS和Express来处理这个问题。

有很多策略:

  1. 即使事务失败,也接受非事务数据库中的更改。接受非事务性数据库可能包含不正确的数据。例如,根据您在SO上查看通知的方式,顶部导航栏中的通知数量可能是错误的
  2. 有一个看门人进程,它定期遍历事务数据库并更新非事务数据库以匹配
  3. 与2相同,但当事务中止时,当您知道需要对非事务数据库进行一些更改时,会触发看门人
  4. 在事务完成后,对非事务数据库执行另一次写入操作。这样,您将错过非事务性数据库中某些已完成事务的数据,但不会有中止事务的数据
  5. 读取时,先从事务数据库读取,然后再从非事务数据库读取。如果事务性数据库中不存在数据,请跳过非事务性读取
  6. 使非事务数据库中的数据过期,以减少数据不正确的时间

相关内容

最新更新