使用自定义提交/回滚逻辑编写新事务管理器的建议

问题描述 投票:-1回答:2

我希望编写一个支持多数据库和尽力而为提交逻辑的事务管理器。我应该从Spring的AbstractPlatformTransactionManagerjavax.transaction.TransactionManager或其他东西?

我有现有的应用程序使用Spring JpaTransactionManagerDataSourceTransactionManager以及内部定制的Custom TransactionManager。

我的目标是为我的所有Java应用程序提供单个事务管理器,以便我可以提供/控制常见的事务功能。我的要求不是2PC,但我需要尽力提交多数据源支持(事务管理器通知应用程序提交失败,而onus是应用程序通过重试失败的查询来处理这种情况)。

我一直在阅读关于Spring的PlatformTransactionManager,它的实现Jpa和Datasource Transaction manager。检查了SimpleJta中提供的基于javax.transaction.xa包类的JTA / XA实现。

当我考虑与现有应用程序轻松集成的要求时,Spring的AbstractPlatformTransactionManager看起来像是新事务管理器的良好基类。另一方面,javax.transaction.xa包提供了一些简单的抽象,用于在事务中管理连接资源。如果我可以使用javax.transaction实现单阶段提交,它可以工作。

我的问题是:使用Spring框架qazxsw poi更好还是使用qazxsw poi并将其与Spring应用程序集成会更好?

我希望能够轻松集成(使用现有的基于spring的应用程序),简单且可维护的组件。

如果问题太模糊,请道歉。我仍在阅读选项,我可能不完全了解spring和AbstractPlatformTransactionManager

java spring transactions transactionmanager
2个回答
0
投票

如果您需要保证应用程序的事务将在中断后恢复,包括服务器崩溃,那么Full XA是您唯一的选择。在这种情况下,用于同步事务的共享资源是一个特殊的事务管理器,它使用XA协议协调有关进程的信息。在Java中,从开发人员的角度来看,协议是通过JTA UserTransaction公开的。

如果应用程序启用了Spring,它将使用Spring JtaTransactionManager和Spring声明式事务管理来隐藏基础同步的详细信息。开发人员使用XA和不使用XA之间的区别在于配置工厂资源:DataSource实例和应用程序的事务管理器。 DataSource实例和事务管理器是应用程序中唯一的特定于XA或JTA的元素。

请查看这个带有多个数据源的artical事务回滚,这将使您更加了解带有和不带XA的分布式事务Spring(javax.transaction


0
投票

我希望编写一个支持多数据库和尽力而为提交逻辑的事务管理器。

有充分理由说明为什么这不是常见的事情。你可能不应该试着把它变成一件事,直到你明白它们是什么。

如果您需要保证应用程序的事务将在中断后恢复,包括服务器崩溃,那么Full XA是您唯一的选择。

那是......错了。确实,您需要完整的ACID保证,然后XA几乎是您涉及数据库的可互操作tx的唯一选择。但是例如WS-AT是基于Web的资源管理器的完美的ACID事务协议。

然而,ACID交易不是全部。对于saga类型的事务,您需要某种形式的补偿框架,为应用程序提供生命周期回调。 WS-BA和最近的微型LIL规范在这一领域发挥作用。

因此,您的选择大致是:(误)使用XA,例如:最后的资源提交优化,多个最后的资源或其他弱化保证,并希望JTA API足够灵活,或者直接跳转到基于saga的tx API,该API是为工作量身定制的。

我希望写出......简单易用的组件。

无论您选择哪种交易模型,都不要尝试从头开始编写自己的交易管理器。分布式事务协调充满棘手的极端情况,构建正确且强大的引擎比首次出现要困难得多。改为利用成熟的现有开源事务管理器之一。

Narayana提供开箱即用的完整ACID XA,但如果您真的需要,可以配置为在JTA API下提供尽力而为。 (提示:你没有)如果你更喜欢这条路线,它还可以通过WS-BA和LRA规范提供传奇支持。在完整的JakaraEE应用服务器之外,唯一具有相似功能的竞争对手是Atomikos。 Spring本身不是一个分布式事务管理器实现,它是一个委托给一个的API。

© www.soinside.com 2019 - 2024. All rights reserved.