背景知识:我遇到了一个问题,我越深入研究XA似乎是正确的解决方案。我有一个"缓存"这基本上是用于保存一些处理过的信息的内存数据结构(树esq。)。使用Spring
,我们设置了数据库并使用@Transactional
,它就像魅力一样。对于大型复杂的业务逻辑,ACID在我们的数据库中是正确的,一切都很好。问题是我们的内存中的数据结构设计不是Transactional
。
我已经了解了本地和全球交易之间的差异,全球变化似乎是我所需要的。当我们执行逻辑时,我们使用"缓存结构"作为一种告知我们做出的决定的方式。然后这些更改需要传播到数据库,但是如果有任何需要回滚的数据库,那么"缓存"没有按'吨
问题我的自定义数据结构需要javax.transaction.xa.XAResource
接口吗?我是否正确理解XA,但不理解它在非数据库/ JMS /等中的使用。设置但更简单的东西?我不介意投入工作基本上包装我的结构并让它实现,但我不确定它是否会达到我真正想要的目标。
TLDR:对于不涉及复杂数据库的简单数据结构,是否可以实现javax.transaction.xa.XAResource
,或者我对JTA
不了解的内容是什么?
答案 0 :(得分:2)
XAResource不是特定于数据库的,可以通过其他类型的资源管理器实现。最常见的是消息队列系统(例如JMS),但许多高速缓存/数据网格产品也支持事务用法,例如参见。
http://infinispan.org/docs/9.0.x/user_guide/user_guide.html#transactions
请注意,根据您的要求,缓存层可能表现为同步而不是XAResource。一些ORM系统以这种方式工作以允许例如预提交会话刷新。
如果您不需要恢复,XAResource是一个相对简单的实现接口,但前提是您的数据源已经具备处理底层属性(原子性,一致性和隔离性)。例如,您的API中的缓存读取或写入是什么样的?如果它没有在缓存结构上运行的事务上下文的概念,那么在查看XA之前,您将遇到一个问题,即您必须解决这个问题。