数据库事务和缓存

时间:2016-11-15 16:13:34

标签: transactions ehcache spring-transactions xa spring-cache

我的问题是,由于一个事务被逐出,并且在事务提交之前另一个事务执行旧值的读取,因此我不时会在缓存中结束过时的对象,因此也将它存储在缓存中。这个应用程序使用spring和ehcache。

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

非常感谢任何建议:)你会做什么以及为什么。

选项1:忽略

好吧,请忽略它并希望最好。不是一个选择。

选项2:transactionAware = true

spring cache manager类的属性。这消除了一个问题,并引入了另一个evict被延迟,直到事务被提交,并且其他事务无法拦截并将旧数据存储在缓存中。不过,如果我在同一个事务中执行一个命中缓存的操作,我将获得旧值,因为它还没有被驱逐。

选项3:XA

从文档中听起来像推荐的方式。

  

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

选项4:本地交易

也许比XA“便宜”但需要一些手工工作。

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

1 个答案:

答案 0 :(得分:0)

如果你真的想成为原子,那么XA就是你的选择。

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