带 jta="true" 的 nonXADatasource 和 XADataSource 有什么区别?

What's the difference between nonXADatasource with jta="true" and XADataSource?

我对我们可以允许将 JTA 事务与非 XA 数据源一起使用这一事实感到困惑。 Link to the documentation。那么 XA/non-XA 数据源之间有什么区别呢?我们为什么要使用 XA 数据源?

An XA transaction, in the most general terms, is a "global transaction" that may span multiple resources. A non-XA transaction always involves just one resource.

An XA transaction involves a coordinating transaction manager, with one or more databases (or other resources, like JMS) all involved in a single global transaction. Non-XA transactions have no transaction coordinator, and a single resource is doing all its transaction work itself (this is sometimes called local transactions).

注:以上解释摘自:theserverside (Mike Spille)

jta="true",事务自动提交。

我自己也在想这个问题("use JTA" 非 XA 数据源中的选项)所以我测试了几种配置。我有一个分布式事务连接到两个 MySQL 服务器。

这是我的结果。如果我有:

  1. 两个非XA数据源,都有JTA="true"

结果:错误"Could not enlist in transaction on entering meta-aware object."

  1. 两个非 XA 数据源,一个 JTA="true"

结果:他们不会参与分布式事务。每个将单独提交。

  1. 一个 XA 和一个带 JTA 的非 XA="false",

结果:同#2

  1. 一个 XA 和一个带有 JTA 的非 XA="true"。

结果:有效!

从这些看来,"use JTA" 选项表明如果存在 XA 数据源,它是否将参与分布式事务。