【问题标题】:Database transactions and caching数据库事务和缓存
【发布时间】: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


    【解决方案1】:

    如果你真的想成为原子,XA 将是要走的路。

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

    【讨论】:

      猜你喜欢
      • 2021-03-30
      • 1970-01-01
      • 2014-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多