2013-12-20 2 views
1

Знаете ли вы, как я могу получить XAResource, который автоматически подключается к моей транзакции, когда я использую диспетчер объектов?JTA (Bitronix)/JPA/Hibernate - Как я могу получить XAResource от Entitymanager?

Я использую 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. Вам просто нужно использовать транзакции ресурсов Local, и если один источник данных выходит из строя, остальное может продолжаться.

+0

Спасибо за ваш ответ, это помогает мне. – ascott