【问题标题】:Is it possible to use more than one persistence unit in a transaction, without it being XA?是否可以在事务中使用多个持久性单元,而不是 XA?
【发布时间】:2010-10-26 16:14:55
【问题描述】:

我们的应用程序需要使用(只读)几个指向不同数据库(不同的商业供应商)的不同持久性单元。

我们没有预算在其中一个(Sybase)上启用 2pc。有没有办法在事务中使用它们而不必是 XA 事务?

我们正在使用 Websphere 6.1、Sybase 12.5.3、Oracle 10g、Java EE 5 和带有 Hibernate Entity Manager 的 JPA。

更新: oracle PU 每月很少更新 1 或 2 次,sybase PU 更新非常频繁——每天很多次。隔离肯定是后者关心的问题,两者之间的一致性不需要强制执行。

【问题讨论】:

    标签: java hibernate jpa transactions jta


    【解决方案1】:

    小心。
    只读并不总是意味着 2PC 不适用。如果您有两个数据库,并且都读取了两个数据库但只更新了一个,那么您需要一个事务来保证一致的结果。假设您有一个场景,您读取数据库 A,然后使用这些结果来读取和更新数据库 B。如果您无法对数据库 A 使用事务,那么当您的操作处于活动状态时,您读取的数据可能数据库 A 可以由另一个应用程序读取和更新。在这种情况下,您可以在数据库 B 中得到不一致的数据。

    如果您确实同时读取了两个数据库并且都不更新,那么您可能再次认为分布式事务及其伴随的锁定是不必要的。再一次,也许不是。在这种情况下,如果其他应用程序正在更新相同的数据库,您也可能会得到不一致的读取。这取决于您的要求和数据库的其他用户。

    我建议reading up on isolation levels 深入了解适用于所有持久存储(如数据库)的锁定,即使在读取操作期间也是如此。事务锁定可能是不必要的;例如,如果您正在处理实际上不会更改的数据(any 应用程序没有写入),则没有必要。

    也许这里有一个商业解决方案 - 与您的供应商协商以降低 XA 启用的价格,并支付它。随着经济的发展,你可能会得到一笔你能负担得起的交易。旁注:我很惊讶您可以许可数据库而不获取交易。我不知道以这种方式许可 Sybase 是可能的。

    【讨论】:

    • 是的,你提出了非常关键的观点。我在 OP 中阐明了两个 PU 的隔离和一致性要求。我们正在与供应商单独谈判。注意:显然数据库带有事务,但是 XA 事务有一个附加的价格标签——欢迎使用 sybase 对事物定价的方式。
    【解决方案2】:

    Atomikos TransactionsEssentials 是一个免费的开源 JTA/XA,带有用于 JDBC(和 JMS)的连接池。

    它的一个特点是增加了对非 xa 数据源的支持。如果只读(您的情况),使用我们的非 xa 数据源将您的 Sybase 包含到 JTA 事务中是安全且容易的。

    最好的 伙计

    【讨论】:

      猜你喜欢
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 2011-02-06
      • 1970-01-01
      • 2023-03-18
      • 2018-06-23
      相关资源
      最近更新 更多