2013-12-20 69 views
1

您是否知道我可以如何使用我的實體管理器時自動註冊到我的事務中的XAResource?JTA(Bitronix)/ JPA/Hibernate - 如何從Entitymanager獲取XAResource?

我使用Bitronix,JPA,hibernate,我的代碼工作正常,但如果某個特定的失敗,我不想回滾所有的XAResources。我只想從當前事務中移除它,而其他人將被提交。

但是爲了除去它的當前事務,我需要對象XaResource,我不知道如何用JPA/Bitronix獲得它。示例代碼:

transactionManager.begin(); 
try { 
    (...) 
    EntityManager em = emf.createEntityManager(); 
    (...) 
    em.close(); 
} catch (Exception e) { 
    // old version - rollback every XaResource in the current transaction 
    //transactionManager.rollback(); 
    //new version wanted - rollbackonly this XaResource  
    transactionManager.getTransaction().delistResource(XaResource ...); 
    throw e; 
} 
transactionManager.commit(); 

感謝您的幫助。

+0

有幫助嗎? – ascott

回答

1

A(tomicity) property of ACID不允許這種情況。只有所有數據源都可以提交,交易才能成功。

我認爲Command Pattern可以幫助你解決你的問題。假設您想更新兩個數據源,並且如果失敗,您仍然可以控制是否撤消已執行的命令。

如果你永遠不想撤銷,那麼你不需要XA事務。您只需使用資源本地事務,並且如果一個數據源發生故障,其餘事件就可以繼續。

+0

感謝您的回答,它可以幫助我。 – ascott

相關問題