3

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

我们没有预算在其中之一(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 更新非常频繁——每天很多次。隔离绝对是后者的关注点,两者之间的一致性没有必要强制执行。

4

2 回答 2

3

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

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

我建议阅读隔离级别,以深入了解适用于所有持久存储(如数据库)的锁定,即使在读取操作期间也是如此。事务锁定可能是不必要的;例如,如果您正在处理实际上不会改变的数据(任何应用程序都没有写入),则没有必要。

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

于 2009-05-16T10:43:41.830 回答
1

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

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

最好的家伙

于 2009-06-02T20:21:34.020 回答