2016-05-24 13 views
0

Ich lese alles über die EJB-Transaktionen durch Online-Ressourcen und wenn ich es anwendete, funktioniert es nicht wie erklärt.EJB-Transaktion

Was ich versuche zu tun,

Ich habe eine stateless EJB-Methode, deren Transaktions Annotation ist

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 

und ich versuche, eine Methode in einem anderen stateless EJB aufzurufen, deren Transaktions Anmerkung ist

@TransactionAttribute(TransactionAttributeType.REQUIRED). 

Hier oben, was ich dachte, ist eine neue Transaktion in meiner Caller-Methode erstellt wird, deren Anmerkung ist

TransactionAttributeType.REQUIRES_NEW 

und wenn ich rufe eine zweite Methode, deren Anmerkung wird

TransactionAttributeType.REQUIRED 

die vorherige Transaktion trägt, aber in meinem Fall eine neue Transaktion in dem zweiten Verfahren hergestellt.

Kann mir jemand helfen, was hier los ist, danke im Voraus.

Ich habe meinen Code unten gepostet.

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

Woher wissen Sie, dass neue Transaktion erstellt wird? Ändern Sie 'REQUIRED' für' MANDATORY' und prüfen Sie, ob eine Ausnahme ausgelöst wird. Wenn dies nicht der Fall ist, wird die Transaktion fortgesetzt. – Geinmachi

Antwort

1

IMO, würden Sie brauchen "ProcessRequests()" mit dem EJB-Stub (I aufzurufen Ich bin nicht sicher, wie es in neueren Versionen von EJBs heißt, früher war es EJB Remote/Local-Schnittstelle). Da Sie "ProcessRequests()" als normalen Methodenaufruf innerhalb einer Methode mit dem Transaktionsattribut "Not required" aufrufen, tritt "Required_new" nicht ein. Hoffen, dass das hilft. -Amit

+0

Ja das war das Problem, ich habe es herausgefunden. Danke für die Antwort Amit. –