2017-08-04 39 views
1

位背景:我遇到了一個問題,我越挖掘它越多的XA似乎是正確的解決方案。我有一個「緩存」,它基本上是一個內存數據結構(樹狀目錄),用於保存一些處理過的信息。使用Spring,我們有我們的數據庫集並使用@Transactional,它一直像魅力一樣工作。對於大型複雜的業務邏輯,ACID在我們的數據庫中保持真實,一切都很好。問題是我們在內存中的數據結構不是TransactionalXA感知數據結構(非數據庫)

我已經學會了當地和全球事務之間的差異,以及全球各種似乎正是我需要的。當我們執行邏輯時,我們使用「緩存結構」作爲通知我們做出決定的一種方式。然後,這些更改需要傳播到數據庫,但是如果需要回滾數據庫,「緩存」不會。

問題javax.transaction.xa.XAResource接口是什麼需要爲我的自定義數據結構?我是否理解XA,但不理解它在非數據庫/ JMS /等中的使用。設置,但更簡單一些?我不介意把工作放在基本上包裹我的結構並實施的地方,但我不確定它是否能達到我真正想要的目標。

TLDR:是否正在實施javax.transaction.xa.XAResource可以用於不涉及複雜數據庫的簡單數據結構,還是有些我不明白的JTA

回答

2

XA資源沒有DB特有的,可以在其他類型的資源管理器來實現。最常見的是消息隊列系統(例如JMS),但許多高速緩存/數據網格產品也支持事務使用,參見例如。

http://infinispan.org/docs/9.0.x/user_guide/user_guide.html#transactions

請注意,根據您的要求,高速緩存層可表現爲同步,而不是一個XA資源。一些ORM系統以這種方式工作以允許例如預先提交會話刷新。

如果您不需要恢復,XA資源是實現一個相對簡單的接口,但只有當你的數據源已經具備處理的基本屬性(原子性,一致性和隔離)。例如,在您的API中,緩存讀取或寫入的內容是什麼樣的?如果它沒有對緩存結構進行操作的事務上下文的概念,那麼在查看XA之前,您有一個問題需要修復。