2011-08-23 46 views
2

我們在整個應用程序中利用內存中的LRU緩存來處理幾種不同的模型。爲了避免事務被回滾(比如陳舊的條目)引起的問題,添加了事務性緩存的概念:爲每個事務創建一個臨時緩存,然後如果條目被回滾或被複制到主如果提交該模型緩存。什麼時候應該調用Transaction.delistResource()?

要做到這一點,高速緩存實現XAResource並覆蓋commit()rollback()方法。每當新的Transaction想要訪問一些不在主緩存中的數據時,就會創建事務緩存並將其傳遞到enlistResource()

的問題是,我試圖在commit()rollback()方法,這是拋出IllegalStateException中調用delistResource()的緩存實例,稱該交易已經被標記爲回滾(或提交)。所以我想知道......是不是而不是將緩存作爲資源去除(換句話說,它已經作爲回滾或提交過程的一部分被除牌),還是流程中還有另一點叫做?

回答

1

它不是調用delistResource的XAResource方法,它是應用程序服務器的Transaction實現。如果你想要一個資源被除名,那麼獲取這個事務並調用它,除非需要,它會在你的資源上調用end()。事務管理器同樣將隱式調用end()作爲終止處理的一部分,所以你不需要在提交或回滾時手動執行。在多個事務上下文中使用相同的資源實例時,您需要處理除名的唯一情況。例如

 

    Cache c = getCache(); 
    c.makeUpdate(); // no transaction running, should auto commit. 
    tx.begin(); // start tx A 
    c.makeUpdate(); // transactional within A 
    tx.suspend(); 
    tx.begin(); // start tx B 
    c.makeUpdate(); // transactional within B 
    tx.commit(); //end B 
    tx.resume(A); 
    tx.commit(); // end A 

根據您的緩存實現可能需要退市的暫停和恢復再爭取,但不提交或回滾。或者,您可以檢查每個makeUpdate()調用的事務上下文,而不是依賴enlist/delist調用的順序來更新資源實例所持有的有效tx上下文。

由於程序XA規範和麪向對象的JTA規範或多或少的映射不佳,這個東西很難。坦率地說,你可能最好把它交給專家。例如,JBoss Infinispan提供了一個開源事務緩存,爲您提供所有這些服務,並提供大量其他功能。

相關問題