2015-01-08 4 views
0

У меня есть staleless сессионный компонент с следующим способом:Container Managed транзакции RollBack

public void process(){ 

try { 
     // function which inserts some data 
     Properties properties = new Properties(); 
     InitialContext ic = new InitialContext(properties); 
     CouponBatchSessionBeanRemote CBSBR = (CouponBatchSessionBeanRemote) ic.lookup(CouponBatchSessionBeanRemote.class.getName()); 
     CBSBR.createCouponBatchFromPlantAppFile(batch); 

     } catch (Exception e1) { 
      context.setRollbackOnly(); 

      try { 
       Properties properties = new Properties(); 
       InitialContext ic = new InitialContext(properties); 
       RPMRequestSessionBeanRemote RPMRq = (RPMRequestSessionBeanRemote) ic.lookup(RPMRequestSessionBeanRemote.class.getName()); 
       RPMRq.updateRPMRqState(RPMRQID, "E"); 

       } catch (Exception e1) { } 

     } 

}

Теперь в первом блоке попробовать, если произошла ошибка транзакции является rolledback. Однако после вызова context.setrollbackonly() следующая транзакция try block не выполняется. Исключенное исключение - это откат транзакции.

+0

Есть ли исключения? –

+0

Исключение - это откат транзакции. –

ответ

0

Поскольку вся текущая транзакция отмечена для отката, второй вызов EJB также будет откат. Вы должны использовать @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) или @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) для вашего RPMRequestSessionBeanRemote bean, в зависимости от того, нужна ли вам транзакция там.

+0

Я использовал @TransactionAttribute на моих ejb-методах, и это сработало! –

0

Это ожидаемое поведение. Граница транзакций находится на уровне метода для управляемых транзакциями транзакций. WriteLog, который, как я полагаю, является вставкой db, также будет откат. Вы должны рассмотреть возможность использования JTA в этом случае или записать вставку db в отдельный вызов как часть обработки исключений клиентом, который инициирует вызов.

EJB 1 (Requires){ 
    try{ 
     call EJB2 (requires new) 
     //throw exception 
    }catch (handle EJB2 exception){ 
     writeLogInDB(); 
    } 
} 
+0

Я отредактировал вопрос. Я вызываю два отдельных EJB в обоих блоках try, однако вторая транзакция транзакции try не выполняется. Я хотел бы откат только транзакции первого вызова ejb, который находится в первом блоке try. –

+0

Что такое параметр транзакции для метода bean-метода RPMRequestSessionBeanRemote.updateRPMRqState()? – ramp

+0

Это управление контейнером. –

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