2016-05-24 3 views
0

Я прочитал все о транзакциях EJB через интернет-ресурсы, и когда я его применил, он не работает, как объяснено.EJB Transaction

То, что я пытаюсь сделать, это

У меня есть лица без метода EJB, чья сделка аннотация

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 

и я пытаюсь вызвать метод в другом безгосударственного EJB, чья сделка аннотация

@TransactionAttribute(TransactionAttributeType.REQUIRED). 

Вот в сверх того, что я думал, что новая сделка создается в моем методе Caller которого аннотации

TransactionAttributeType.REQUIRES_NEW 

и когда я называю второй метод, для которого аннотации

TransactionAttributeType.REQUIRED 

предыдущая транзакция продолжается, но в моем случае новая транзакция создается во втором методе.

Кто-нибудь может мне помочь, что происходит здесь, спасибо заранее.

Я разместил свой код ниже.

EOutboundHandler.java

@Stateless 
@EJB(name = "EOutboundHandler") 
public class EOutboundHandler { 

@EJB 
    private EData eData; 

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
    public void Process() { 
     while (ProcessRequests()) { 
     } 
    } 
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    private boolean ProcessRequests() { 
EQueue eQueue = eData.searchEQ(); 
} 
} 

EData.java

 @Stateless 
     @EJB(name="EData") 
     @TransactionAttribute(TransactionAttributeType.REQUIRED) 
     public class EData { 
      @PersistenceContext(unitName=EDataConstants.PERSISTANCE_UNIT_NAME) 
      private EntityManager em; 
     public EdiTxnQ searchEdiTxnQForSendMsg() 
      { 

       String searchSql = 
         "SELECT * FROM dbo.EQueue with (updlock, readpast) Where id = 1"; 

       Query searchQuery = em.createNativeQuery(searchSql, EdiTxnQ.class); 
       List<EdiTxnQ> list = searchQuery.getResultList(); 

       if (list.isEmpty()) 
       { 
        return null; 
       } 
       else 
       { 
        return (EdiTxnQ)list.get(0); 
       } 

      } 
} 
+1

Как вы знаете, что создана новая транзакция? Попробуйте изменить 'REQUIRED' для' MANDATORY' и проверить, не выбрано ли исключение. Если это не так, транзакция продолжается. – Geinmachi

ответ

1

IMO, Вы должны были бы вызвать "ProcessRequests()" с помощью EJB Stub (I я не уверен, что он назвал в новой версии EJB, раньше это был EJB Remote/Local interface). Поскольку вы вызываете «ProcessRequests()» в качестве обычного вызова метода из метода, который имеет атрибут транзакции «Не требуется», «Required_new» не пинает. Надеюсь, это поможет. -Amit

+0

Да, это была проблема, я понял это. Спасибо за ответ Амит. –