2016-11-15 115 views
0

我的问题是,由于一个事务驱逐,并且在事务提交之前另一个事务执行旧值的读取并因此也将其存储在缓存。这个应用程序使用spring和ehcache。数据库事务和高速缓存

到目前为止,我的研究已经涉及到这些选项,但如果还有更多选项,我不会感到惊讶。我错过了什么吗?

任何意见是非常感谢:)你会怎么做,为什么。

选项1:Ignoreance

好,就忽视它,并希望最好的结果。不是一个真正的选择。

选项2:transactionAware =真

在弹簧高速缓存管理器类的属性。这消除了一个问题并引入了另一个问题驱逐出现延迟,直到事务被提交并且其他事务不能截获旧数据并将其存储在高速缓存中。尽管如此,如果我在同一事务执行一个命中缓存的操作,我会得到旧值,因为它还没有被驱逐。

方案3:XA

从它听起来像推荐的方法的文档。

当您从其他数据存储库(如DBMS或JMS)缓存数据并希望在JTA API(“Java Transaction API”)的控制下以原子方式执行此操作时使用此模式,但没有完整的两阶段提交的开销。

方案4:本地事务

也许“更便宜”比XA但需要一些体力劳动。

选项5:重新设计 更改应用程序的设计,以便这些事务没有竞争条件。

回答

0

如果你真的想成为原子,XA将是最好的选择。

然后,选项2可能会更简单,但你将不得不在工作单位工作。工作单元包含交易的有效数据。并防止从缓存中获取陈旧的数据。它用作缓存上的缓存。 Hibernate会话就是一个例子。其内容始终是该交易的最新内容。