的背景:我遇到了一个问题,我越深入研究它,XA就越像是正确的解决方案。我有一个“缓存”,它基本上是内存数据结构(tree )。用来保存一些处理过的信息。使用Spring,我们有我们的数据库集和使用的@Transactional,这一直是一个魅力。对于大型复杂的业务逻辑,ACID在我们的DB中是正确的,一切都很好。问题是我们内存中的数据结构按设计不是Transactional。
我已经了解了本地事务和全球事务之间的差异,而全球事务的多样性似乎正是我所需要的。当我们执行逻辑时,我们使用“缓存结构”来通知我们所做的决策。然后,这些更改需要传播到DB,但如果需要回滚,则DB会回滚,而“缓存”则不会。
问题是javax.transaction.xa.XAResource接口,我的自定义数据结构需要什么?我是否正确地理解XA,但不理解它在非数据库/JMS/等环境中的使用,但它的使用要简单得多?我不介意投入工作,基本上包装我的结构,并有它的实现,但我不确定它是否会达到我真正想要的目标。
TLDR:对于不涉及复杂DB的更简单的数据结构,实现javax.transaction.xa.XAResource是可行的吗?还是我对JTA不理解?
发布于 2017-08-07 10:47:58
XAResource不是特定于db的,可以在其他类型的资源管理器上实现。最常见的是消息队列系统(例如JMS),但是许多缓存/数据存储产品也支持事务性使用,参见。
guide.html#transactions
注意,根据您的需求,缓存层可能表现为同步而不是XAResource。有些ORM系统以这种方式工作,例如预提交会话刷新。
如果您不需要恢复,XAResource是一个相对简单的接口来实现,但前提是您的数据源已经具备了处理底层属性(原子性、一致性和隔离性)的条件。例如,在您的API中,缓存读或写的样子是什么?如果它没有在缓存结构上操作的事务上下文的概念,那么在查看XA之前,您将不得不修复一个问题。
https://stackoverflow.com/questions/45509634
复制相似问题