1

我正在尝试使用 Terracotta Ehcache(开源)对分布式事务内存进行一些基准测试。我在理解它与 JTA 的工作时遇到了一些问题。在代码中,我发现对分布式事务感兴趣的缓存将自己作为具有 JTA 的资源登记为 JTA 稍后在其上执行两阶段提交的资源。

我的问题是,如果只有一个缓存被列为资源,JTA 将如何能够在分布式设置中自动更新所有其他缓存?我们没有将其他缓存引用传递给 JTA,因此不会对它们进行原子更新。我觉得,我在这里遗漏了一些字符串,谁能解释它是如何工作的?我也是 J2EE 的新手,我是否遗漏了一些允许将其他缓存自动引用传递给 JTA 的 J2EE 概念?

4

3 回答 3

4

如果以这种方式(transactionalMode="xa"transactionalMode="xa_strict")配置 Ehcache,则可以作为完整的 XAResource 参与 JTA 事务(全局事务),该事务由事务管理器(来自您的应用程序服务器或某些独立产品)控制。在这种情况下,Ehcache 本身负责在事务管理器中注册。此外,作为一个完整的 XAResource,可以注册多个缓存并且可以成为事务的一部分。

强大的集群范围的一致性非常昂贵(没有免费的午餐)。它归结为使用锁和涉及等待、确认等的同步(网络)操作。

如需更详细的阅读,我建议您查阅 Ehcache 文档:Ehcache 中的事务

于 2011-11-23T18:42:04.673 回答
1

在 JTA 事务中配置transactionalMode="xa_strict"和更新的每个缓存都将自己注册为事务管理器的 XAResource。这对最终用户来说都是自动化和透明的,你不需要做任何特别的事情来启动这个机制,你只需要在 JTA 请求中使用你的缓存

如果您还碰巧访问了 JTA 事务上下文中的其他非事务性缓存,则这些缓存不会成为事务的一部分,并且会在您修改它们时立即更新。

于 2011-11-25T11:37:50.087 回答
0

试过 xa_strict 但似乎没有自动登记 XAResource?切换到普通 xa 工作虽然......

于 2014-10-02T10:29:59.147 回答