XA/JTA事务仍在使用吗?

6
我有一个应用程序,涉及多个数据库和一些定制服务。对于某些操作,我需要类似事务的行为,即如果出现错误,一组更改会在所有数据库/服务上同时提交或全部回滚。
X / Open组织的XA标准和Java JTA似乎正好使用两阶段提交过程解决了这个问题。一些数据库(如MySQL、Postgres、Oracle)支持这些接口,但我感到它们并不常用或者正在流行度下降。是真的吗?如果是,为什么?
我知道在MySQL上XA存在一些复制相关的问题。此外,XA事务可能会显著变慢。还有其他原因导致XA不受欢迎或不常见吗?

XA只在所有(或除一个之外的所有)数据源都支持两阶段提交时才能正常工作。2PC有一些开销,并需要更多的监控来确保放弃的准备提交不会停留并阻塞数据库。当您需要跨多个系统进行事务行为时,它非常有用,但如果不需要,则最好避免以减少复杂性。 - Craig Ringer
2个回答

7
有关XA的几个要点:
  • 它可以完成它的工作,没有受到广泛认可的替代方案。如果您必须使用分布式事务,则无法回避XA。
  • 它是“标准技术”,没有炒作和营销。因此,大多数人都没有关注它。
  • 即使在使用时,Jack应用程序开发者通常也不知道它存在,因为大部分都隐藏在某些框架中。
  • 需要XA的需求确实有所下降,因为面向服务的体系结构(SOA)和消息队列是被大肆宣传的体系结构范例,试图避免这种子系统之间的紧密耦合。尽管至少SOA似乎也在相当程度上下降。;-)
  • XA经常被忽视的部分是当事务实际中断时所需的代码和工具。在XA的一些边缘地带,事务管理器有时无法提交或回滚所有资源相当长的时间。这个点只会增加“只有在真正必须使用它时才使用”的要点。

实际上第二点是不正确的。如果您使用两个Oracle数据库并对两个Oracle数据库进行更改,则不需要XA。 - steve
@Steve:我有点困惑:第二点是关于炒作和营销的。但你评论的后半部分更符合第一点,“没有__被接受的__替代品”。我并没有说地球上没有替代方案,只是没有大多数其他数据库也支持的替代方案。此外:XA 的一个关键点是,没有“主”数据库,而只有平等的参与者以及一位裁判(TX 管理器)。使用 DB-Link 时,所有参与者都必须就一个“主”数据库达成共识,该数据库设置了链接,因此是单点故障。因此,在我看来,这并不是真正的“分布式”。 - A.H.
你正在做一个简单错误的假设,分布式事务并不等同于使用XA。 - steve
@Steve:你说得对,对于同构系统,也有供应商特定的解决方案。但是对于异构系统,我不知道实际上还有哪种技术能够胜任。你知道吗? - A.H.

1

它们仍然被用于你所提到的目的。如果一个数据库操作失败,那么所有操作都会回滚。

它们速度较慢,因此如果不需要XA(即自主操作或非事务性操作),则不应使用。

当处理多个数据库时,Java EE容器甚至可能强制您使用XA数据源。


如果不能使用,则不应该使用。实现可以自动优化并检测是否根本没有进行事务性工作或涉及最多1个本地事务的事务性工作。例如,请参见https://access.redhat.com/site/documentation/en-US/JBoss_Enterprise_Application_Platform/5/html/Administration_And_Configuration_Guide/lrco-overview.html。 - Arjan Tijms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接