亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我們可以編寫自定義 Spring 事務管理器嗎?

我們可以編寫自定義 Spring 事務管理器嗎?

心有法竹 2023-06-14 15:58:03
假設我們有一個businessLogic()方法做兩件事:在本地緩存中寫入一些信息并將相同的信息保存在使用的數據庫中,JDBC以便緩存和數據庫的內容始終相同。我知道我們可以使用 Spring 的JDBC數據源事務管理器在出現異常時自動回滾數據庫。但是,在這種情況下,我們如何定義一個自定義的事務管理器,它也回滾緩存的內容,以便緩存和 DB 的內容始終保持同步?謝謝大家。
查看完整描述

3 回答

?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

Gab 的回答是正確的,除了不正確的部分。

XA 確實是協調多個資源更新的標準方法...除了緩存是本地的,即進程內緩存,它不一定是資源。

緩存并不完全“實現 JTA”,它根據其部署方式充當 XA 協議中的兩個角色之一。它可以是 XAResource,但通常只有在其生命周期不同于客戶端進程的情況下才需要。對于進程內使用,它更有可能是同步。

這些角色之間的主要區別在于:XAResource 是容錯的,但 Synchronization 不是。對于客戶端進程內存中的易失性緩存,在崩潰后通過查詢數據庫重建緩存就足夠了。對于進程外的緩存,客戶端在 db tx 提交之后但在緩存更新之前崩潰將使緩存不同步,至少直到它過期或被手動刷新。

根據緩存實現,不能保證它會自動選擇正確的模式。

Spring 實際上也不是 JTA XA 事務管理器,盡管它確實在它們之上提供了一個抽象層??梢允褂?Spring 在非 XA 模式下驅動數據庫,但是你沒有用于緩存同步的標準掛鉤,你需要一個專有接口?;蛘吣梢宰寯祿焱ㄟ^單階段資源適配器執行偽 XA。Full-on 2PC 對于您的用例來說可能有點矯枉過正。


查看完整回答
反對 回復 2023-06-14
?
Qyouu

TA貢獻1786條經驗 獲得超11個贊

首先我認為緩存的事務管理任務是多余的。我建議您僅在成功提交數據庫級事務后才更新緩存。

如果數據庫中實體的更新與其緩存狀態之間的窗口很小,那么大多數使用緩存的場景都是完全可以接受的。

如果您的案例拒絕任何緩存過時的可能性,那么您可能必須避免使用緩存或使用一些特殊的緩存,可能是與支持事務的原始數據相同的數據庫。否則,您在嘗試保持兩個不同系統之間的一致性時遇到問題:數據庫級別和緩存級別。大多數時候,你能達到的最好結果是最終一致性——這意味著無論如何你都會有不一致狀態的窗口,只有到那時(最終)數據才會變得一致。


查看完整回答
反對 回復 2023-06-14
?
UYOU

TA貢獻1878條經驗 獲得超4個贊

處理分布在多個資源之間的事務的標準方法是使用XA

然后,您必須使用 xa-datasource 訪問您的數據庫并使用實現JTA 的緩存實現,例如。緩存。

我對 spring boot 不是很熟悉,但是事務管理器應該通過適當的配置(不需要重寫任何東西)開箱即用地管理跨兩個資源的事務同步


查看完整回答
反對 回復 2023-06-14
  • 3 回答
  • 0 關注
  • 190 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號