3 回答

TA貢獻1864條經(jīng)驗 獲得超6個贊
Gab 的回答是正確的,除了不正確的部分。
XA 確實是協(xié)調(diào)多個資源更新的標準方法...除了緩存是本地的,即進程內(nèi)緩存,它不一定是資源。
緩存并不完全“實現(xiàn) JTA”,它根據(jù)其部署方式充當(dāng) XA 協(xié)議中的兩個角色之一。它可以是 XAResource,但通常只有在其生命周期不同于客戶端進程的情況下才需要。對于進程內(nèi)使用,它更有可能是同步。
這些角色之間的主要區(qū)別在于:XAResource 是容錯的,但 Synchronization 不是。對于客戶端進程內(nèi)存中的易失性緩存,在崩潰后通過查詢數(shù)據(jù)庫重建緩存就足夠了。對于進程外的緩存,客戶端在 db tx 提交之后但在緩存更新之前崩潰將使緩存不同步,至少直到它過期或被手動刷新。
根據(jù)緩存實現(xiàn),不能保證它會自動選擇正確的模式。
Spring 實際上也不是 JTA XA 事務(wù)管理器,盡管它確實在它們之上提供了一個抽象層??梢允褂?Spring 在非 XA 模式下驅(qū)動數(shù)據(jù)庫,但是你沒有用于緩存同步的標準掛鉤,你需要一個專有接口?;蛘吣梢宰寯?shù)據(jù)庫通過單階段資源適配器執(zhí)行偽 XA。Full-on 2PC 對于您的用例來說可能有點矯枉過正。

TA貢獻1786條經(jīng)驗 獲得超11個贊
首先我認為緩存的事務(wù)管理任務(wù)是多余的。我建議您僅在成功提交數(shù)據(jù)庫級事務(wù)后才更新緩存。
如果數(shù)據(jù)庫中實體的更新與其緩存狀態(tài)之間的窗口很小,那么大多數(shù)使用緩存的場景都是完全可以接受的。
如果您的案例拒絕任何緩存過時的可能性,那么您可能必須避免使用緩存或使用一些特殊的緩存,可能是與支持事務(wù)的原始數(shù)據(jù)相同的數(shù)據(jù)庫。否則,您將在嘗試保持兩個不同系統(tǒng)之間的一致性時遇到問題:數(shù)據(jù)庫級別和緩存級別。大多數(shù)時候,你能達到的最好結(jié)果是最終一致性——這意味著無論如何你都會有不一致狀態(tài)的窗口,只有到那時(最終)數(shù)據(jù)才會變得一致。

TA貢獻1878條經(jīng)驗 獲得超4個贊
處理分布在多個資源之間的事務(wù)的標準方法是使用XA
然后,您必須使用 xa-datasource 訪問您的數(shù)據(jù)庫并使用實現(xiàn)JTA 的緩存實現(xiàn),例如。緩存。
我對 spring boot 不是很熟悉,但是事務(wù)管理器應(yīng)該通過適當(dāng)?shù)呐渲茫ú恍枰貙懭魏螙|西)開箱即用地管理跨兩個資源的事務(wù)同步
添加回答
舉報