2016-11-15 151 views
0

我的問題是,由於一個事務驅逐,並且在事務提交之前另一個事務執行舊值的讀取並因此也將其存儲在緩存。這個應用程序使用spring和ehcache。數據庫事務和高速緩存

到目前爲止,我的研究已經涉及到這些選項,但如果還有更多選項,我不會感到驚訝。我錯過了什麼嗎?

任何意見是非常感謝:)你會怎麼做,爲什麼。

選項1:Ignoreance

好,就忽視它,並希望最好的結果。不是一個真正的選擇。

選項2:transactionAware =真

在彈簧高速緩存管理器類的屬性。這消除了一個問題並引入了另一個問題驅逐出現延遲,直到事務被提交併且其他事務不能截獲舊數據並將其存儲在高速緩存中。儘管如此,如果我在同一事務執行一個命中緩存的操作,我會得到舊值,因爲它還沒有被驅逐。

方案3:XA

從它聽起來像推薦的方法的文檔。

當您從其他數據存儲庫(如DBMS或JMS)緩存數據並希望在JTA API(「Java Transaction API」)的控制下以原子方式執行此操作時使用此模式,但沒有完整的兩階段提交的開銷。

方案4:本地事務

也許「更便宜」比XA但需要一些體力勞動。

選項5:重新設計 更改應用程序的設計,以便這些事務沒有競爭條件。

回答

0

如果你真的想成爲原子,XA將是最好的選擇。

然後,選項2可能會更簡單,但你將不得不在工作單位工作。工作單元包含交易的有效數據。並防止從緩存中獲取陳舊的數據。它用作緩存上的緩存。 Hibernate會話就是一個例子。其內容始終是該交易的最新內容。