早上好,
我正在开发一个项目,我将数据保存到Mongo DB以及Sql Server(首先是实体框架代码)。在许多场景中,我在单个代码块中对每个数据库执行写操作。我想知道,你们中的任何人都可以建议一种方法来处理类似于交易的事情吗?如果代码块的任何部分失败,整个事情应该失败并回滚?
答案 0 :(得分:2)
我不认为有这样做的防弹方式,因为你不仅有两个独立的连接,还有两个不同的架构。
假设您的SQL Server有更复杂的数据模型(由于某种原因更可能失败的那个)我过去想出了一种适合我的方法:
您稍后可以使用错误日志手动或自动挽救您的数据。在任何情况下,您都应该为所有语句实现重试策略,因为操作失败的最可能原因是(鉴于您的代码是正确的)时间问题,并且重试通常会解决此问题。如果你做得对,那么每月可能会出现一个异国错误。
当然,在第4步中,您可以尝试恢复SQL操作,而不是(或除此之外)编写日志条目。但这主要是繁琐的,如果恢复失败,请留下问题该怎么办。
也许还有一些神奇的中间件可以将MongoDB语句集成到SQL事务中,但目前我只是承认数据的一致性和使用不同的数据库是相反的目标。尽量密切监控错误并降低错误潜力。
答案 1 :(得分:1)
两阶段提交将适合您的方案。在单个事务中,我们可以命中任何数字(通常我们使用两个)DB,并在数据库中保持数据同步。
有关两阶段提交的更多信息
https://lostechies.com/jimmybogard/2013/05/09/ditching-two-phased-commits/
https://sankarsan.wordpress.com/tag/two-phase-commit/
阅读这篇文章
How to force only one transaction within multiple DbContext classes?