我的问题是,由于一个事务被逐出,并且在事务提交之前另一个事务执行旧值的读取,因此我不时会在缓存中结束过时的对象,因此也将它存储在缓存中。这个应用程序使用spring和ehcache。
到目前为止,我的研究已经有了这些选择,但如果还有更多,我也不会感到惊讶。我错过了什么吗?
非常感谢任何建议:)你会做什么以及为什么。
选项1:忽略
好吧,请忽略它并希望最好。不是一个选择。
选项2:transactionAware = true
spring cache manager类的属性。这消除了一个问题,并引入了另一个evict被延迟,直到事务被提交,并且其他事务无法拦截并将旧数据存储在缓存中。不过,如果我在同一个事务中执行一个命中缓存的操作,我将获得旧值,因为它还没有被驱逐。
选项3:XA
从文档中听起来像推荐的方式。
当您从其他数据存储(例如DBMS或JMS)缓存数据时,请使用此模式,并希望在JTA API的控制下以原子方式执行此操作(" Java Transaction API")但没有完全两阶段提交的开销。
选项4:本地交易
也许比XA“便宜”但需要一些手工工作。
选项5:重新设计 更改应用程序的设计,以便这些事务没有竞争条件。
答案 0 :(得分:0)
如果你真的想成为原子,那么XA就是你的选择。
然后,选项2可能更简单,但您必须在工作单元中工作。工作单元包含事务的有效数据。并防止从缓存中获取陈旧数据。它用作缓存上的缓存。一个例子是Hibernate会话。其内容始终是最新的交易。