更好地理解 XA 数据源

Undestand better XA Datasource

我想在 2 个不同位置的数据库中分离 2 个 table...所以 1 个 MySQL 数据库在一个数据中心,另一个 1 在另一个数据中心。

我在 Wildfly 中使用普通数据源连接到使用 JPA 的 java 应用程序。现在我只想维护在实体管理器中配置的一个数据源。但是我必须连接第二个数据库并在单个事务中与第一个数据库进行管理。

为此我想我需要一个 XA 数据源,所以我必须在 wildfly 中配置一个数据源,其中包含指向我的 2 MySQL 数据库和 persistance.xml 将 jta 数据源指向 XA 数据源名称?对吗?

对于这种情况,是否存在 XA 数据源,以透明方式管理 2 个数据库之间的事务?

您应该为每个架构配置一个单独的数据源。

MySQL 和 MariaDB 不完全兼容 XA。在 Wildfly 服务器中使用 JTA 时,我注意到很多问题。一个主要问题是 MySQL 和 MariaDB 不支持嵌套事务,正如 JTA 所要求的那样。

一个例子:

start transaction;
insert into user...
    start transaction;
    insert into user_details...
    commit;
insert into orders...
rollback;

您会期望一切都回滚,因为外部事务已回滚。但是相反,将提交对用户和 user_details 表的插入,并且只会回滚订单。

JavaEE 的整个事务管理由于该限制而产生奇怪的结果。所以最好不要使用它。

我写了一篇关于测试 Java 企业应用程序的文章,其中包含如何在没有 JTA 的情况下使用 EntityManagerFactory 和 EntityManager 的示例:

http://stefanfrings.de/enterprise_junit/index.html#jndi

英文翻译:

https://translate.google.com/translate?hl=en&sl=de&tl=en&u=http%3A%2F%2Fstefanfrings.de%2Fenterprise_junit%2F(跳转到JNDI章节)