有没有办法将Sql和Mongo更新包装到单个事务中

时间:2016-07-05 08:38:01

标签: c# mongodb entity-framework-6

早上好,

我正在开发一个项目,我将数据保存到Mongo DB以及Sql Server(首先是实体框架代码)。在许多场景中,我在单个代码块中对每个数据库执行写操作。我想知道,你们中的任何人都可以建议一种方法来处理类似于交易的事情吗?如果代码块的任何部分失败,整个事情应该失败并回滚?

2 个答案:

答案 0 :(得分:2)

我不认为有这样做的防弹方式,因为你不仅有两个独立的连接,还有两个不同的架构。

假设您的SQL Server有更复杂的数据模型(由于某种原因更可能失败的那个)我过去想出了一种适合我的方法:

  1. 顺序执行操作,而不是同时执行两个操作
  2. 首先执行SQL声明,如果失败则不执行MongoDB声明并且您将保持一致
  3. 如果成功,请执行下一个MongoDB语句
  4. 如果MongoDB语句失败,请写入错误日志。确保日志不在远程计算机上,以便日志记录可能失败的可能性尽可能小。
  5. 您稍后可以使用错误日志手动或自动挽救您的数据。在任何情况下,您都应该为所有语句实现重试策略,因为操作失败的最可能原因是(鉴于您的代码是正确的)时间问题,并且重试通常会解决此问题。如果你做得对,那么每月可能会出现一个异国错误。

    当然,在第4步中,您可以尝试恢复SQL操作,而不是(或除此之外)编写日志条目。但这主要是繁琐的,如果恢复失败,请留下问题该怎么办。

    也许还有一些神奇的中间件可以将MongoDB语句集成到SQL事务中,但目前我只是承认数据的一致性和使用不同的数据库是相反的目标。尽量密切监控错误并降低错误潜力。

答案 1 :(得分:1)

两阶段提交将适合您的方案。在单个事务中,我们可以命中任何数字(通常我们使用两个)DB,并在数据库中保持数据同步。

有关两阶段提交的更多信息

https://lostechies.com/jimmybogard/2013/05/09/ditching-two-phased-commits/

https://www.coursera.org/learn/data-manipulation/lecture/mXS0H/two-phase-commit-and-consensus-protocols

https://sankarsan.wordpress.com/tag/two-phase-commit/

阅读这篇文章

How to force only one transaction within multiple DbContext classes?