2013-10-09 2 views
1

Я экспериментирую с транзакциями JTA и не могу понять, почему метод, который помечен для создания новой транзакции, не редактируется (код редактируется соответствующим образом). Это переделывает предыдущего вопроса, я спросил на тему (here):Почему новая транзакция JTA не создается?

@Stateless 
public class StaffEntityOps 
{ 
    @Resource TransactionSynchronizationRegistry txReg; 

    private void transactionStatus(String where) 
    { 
    String msg; 
    int stat = txReg.getTransactionStatus(); 
    switch (stat) { 
     case STATUS_ACTIVE: 
     msg = "Active"; 
     break; 
     case STATUS_NO_TRANSACTION: 
     msg = "No Transaction"; 
     break; 
     default: 
     msg = "Other: " + stat; 
    } 
    System.out.println("Transaction status in " + where + ": " + msg); 
    } 

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    private void saveToEM(EntityManager em, StaffEntity staffEntity) 
     throws ... 
    { 
    transactionStatus("saveToEM: "); 
    em.persist(staffEntity); 
    em.flush(); 
    } 

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
    public void add(StaffEntity staffEntity) 
     throws ... 
    { 
    // Entity Managers emDB1 and emDB2 are injected into class. 
    transactionStatus("add: "); 
    saveToEM(emDB1, staffEntity); 
    saveToEM(emDB2, staffEntity); 
    } 

Идея выше, должен был вызвать метод add(StaffEntity staffEntity) упорствовать новый StaffEntity к набору не-XA DataSources , Я решил это с помощью транзакций, управляемых бинами (предыдущий вопрос, процитированный выше), а также с XA-DataSources. Мне все же хотелось бы определить, есть ли способ сделать это с помощью транзакций, управляемых контейнером, и источников данных, отличных от XA (в основном для понимания того, как аннотация @TransactionAttribute влияет на вещи).

Попытка, описанная выше, пытается явно создать новую транзакцию для сохранения в каждой базе данных, изолировав ее по своему собственному методу и маркируя ее REQUIRES_NEW. Это не работает. Сообщения sysout показывают, что в методах add и saveToEM есть «Нет транзакции».

Почему не создается новая транзакция для каждого вызова saveToEM? Для меня имеет смысл, что метод add имеет «No Transaction», потому что он помечен NOT_SUPPORTED. Но не должно ли REQUIRES_NEW на saveToEM создавать новую транзакцию при каждом ее вызове? (Glassfish 4.0, EclipseLink 2.5)

+0

Как вы получаете/устанавливаете экземпляр em? Вы пробовали пример JPA на Glassfish, например https://blogs.oracle.com/arungupta/entry/jpa_2_1_implementation_eclipselink? – Chris

+0

Каждый экземпляр em имеет нечто вроде '@PersistenceContext (unitName =" jdbc/.. something .. ") EntityManager emdb1;' Я должен отметить, что использование JPA работает нормально - пока я не попытаюсь что-то сделать с более чем 1 источник данных. Как только я попытаюсь использовать оба одновременно, я получаю ошибку, отличную от XA (что я понимаю). Поэтому я пытаюсь отделить оставшиеся данные от разных источников данных в своих транзакциях, чтобы избежать использования источников данных XA. – CraftWeaver

+1

Я верю, потому что saveToEM вызывается локально, контейнер не запускает транзакцию для вызова. Он рассматривается как метод Java. – Chris

ответ

0

Поскольку saveToEM вызывается локально, он рассматривается как только метод java, поэтому контейнер не запускает транзакцию для вызова.

Смежные вопросы