2017-08-04 38 views
1

位背景:我遇到了一个问题,我越挖掘它越多的XA似乎是正确的解决方案。我有一个“缓存”,它基本上是一个内存数据结构(树状目录),用于保存一些处理过的信息。使用Spring,我们有我们的数据库集并使用@Transactional,它一直像魅力一样工作。对于大型复杂的业务逻辑,ACID在我们的数据库中保持真实,一切都很好。问题是我们在内存中的数据结构不是TransactionalXA感知数据结构(非数据库)

我已经学会了当地和全球事务之间的差异,以及全球各种似乎正是我需要的。当我们执行逻辑时,我们使用“缓存结构”作为通知我们做出决定的一种方式。然后,这些更改需要传播到数据库,但是如果需要回滚数据库,“缓存”不会。

问题javax.transaction.xa.XAResource接口是什么需要为我的自定义数据结构?我是否理解XA,但不理解它在非数据库/ JMS /等中的使用。设置,但更简单一些?我不介意把工作放在基本上包裹我的结构并实施的地方,但我不确定它是否能达到我真正想要的目标。

TLDR:是否正在实施javax.transaction.xa.XAResource可以用于不涉及复杂数据库的简单数据结构,还是有些我不明白的JTA

回答

2

XA资源没有DB特有的,可以在其他类型的资源管理器来实现。最常见的是消息队列系统(例如JMS),但许多高速缓存/数据网格产品也支持事务使用,参见例如。

http://infinispan.org/docs/9.0.x/user_guide/user_guide.html#transactions

请注意,根据您的要求,高速缓存层可表现为同步,而不是一个XA资源。一些ORM系统以这种方式工作以允许例如预先提交会话刷新。

如果您不需要恢复,XA资源是实现一个相对简单的接口,但只有当你的数据源已经具备处理的基本属性(原子性,一致性和隔离)。例如,在您的API中,缓存读取或写入的内容是什么样的?如果它没有对缓存结构进行操作的事务上下文的概念,那么在查看XA之前,您有一个问题需要修复。