java - Spring 链式事务管理器与 Atomikos
问题描述
嗨,我有一个分布式事务,我必须以某种方式管理它们
另一方面,在 spring 生态系统中,ChainedTransactionManager 可以做到这一点,而在 spring 文档中 Atomikos 可以用于分布式事务
https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-jta.html
我应该使用哪一个?我更喜欢留在 Spring 库中,但 Atomikos 不仅仅是 Spring 事务管理器?如果有人同时使用它们,可以比较优缺点
解决方案
使用 Atomikos 是一个更好的整体解决方案。在某些情况下,您可以使用 ChainedTransactionManager。它所做的假设在 javadocs 中有说明:
PlatformTransactionManager 实现,用于协调事务创建、提交和回滚到委托列表。使用此实现假定导致事务回滚的错误通常发生在事务完成之前或最内部的 PlatformTransactionManager 提交期间。
配置的实例将按照给定的顺序启动事务并以相反的顺序提交/回滚,这意味着最有可能中断事务的 PlatformTransactionManager 应该是配置列表中的最后一个。在提交期间抛出异常的 PlatformTransactionManager 将自动导致剩余的事务管理器回滚而不是提交。
提交一个事务而另一个失败的机会仍然存在于 ChainedTransactionManager。
使用 Atomikos 是一个真正的分布式事务,在两个数据库上都是全有或全无。但这也会产生一些影响应用程序支持的后果,例如,当 TX 在一个数据库上完全提交并在另一个数据库上准备好时,此时应用程序崩溃。您需要确保您的应用程序可以从这种情况中恢复。通常,当应用程序重新启动时,TX 会在第二个数据库上完全提交,但这可能不会发生。
那么哪一个是正确的呢?这取决于。
推荐阅读
- javascript - 悬停在 svg 元素上时尝试隐藏 div 时出现问题
- python - Allauth 不适用于 django 中的 twitch
- java - 使用 Java 运行 Spark 的 cmd 错误“此时 Common 是意外的”
- javascript - 如何让 css-loader 和 style-loader 正常工作以允许我将 CSS 文件与 Webpack 一起使用?
- python - Q: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe3 in position 0: unexpected end of data
- swift - 在 SwiftUI 视图中插入非列表元素
- graphql - 困惑为什么 returnPartialData 在 Apollo Client 3 中没有字段策略的情况下工作
- selenium-chromedriver - 在 chrome94 上,硒无法定位元素
- python - 如何创建具有 msg 功能的 tkinter Python 聊天应用程序?
- javascript - 尝试在正则表达式掩码后添加字母单词