【发布时间】:2016-11-15 16:13:34
【问题描述】:
我的问题是,由于一个事务被逐出,并且在事务提交另一个事务之前读取旧值并将其存储在缓存中,因此有时我会在缓存中找到过期的对象。此应用程序正在使用 spring 和 ehcache。
到目前为止,我的研究已经涉及到这些选项,但如果还有更多,我不会感到惊讶。我错过了什么吗?
非常感谢任何建议 :) 你会做什么以及为什么。
选项 1:无知
好吧,忽略它并希望最好。不是一个真正的选择。
选项 2:transactionAware=true
spring 缓存管理器类的一个属性。这消除了一个问题并引入了另一个问题。驱逐被延迟,直到事务提交并且其他事务无法拦截并将旧数据存储在缓存中。不过,如果我在同一个事务中执行一个命中缓存的操作,我将获得旧值,因为它还没有被驱逐。
选项 3:XA
从文档来看,这听起来像是推荐的方式。
当您缓存来自其他数据存储(例如 DBMS 或 JMS)的数据并希望在 JTA API(“Java 事务 API”)的控制下以原子方式执行此操作但没有完整的两阶段提交。
选项 4:本地事务
可能比 XA“便宜”,但需要一些手动操作。
选项 5:重新设计 更改应用程序的设计,使这些事务不存在竞争条件。
【问题讨论】:
标签: transactions ehcache spring-transactions xa spring-cache