容器管理事务RollBack

时间:2015-01-08 07:01:03

标签: java transactions ejb

我有一个陈旧的会话bean,其中包含以下方法:

 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) { }

        }

}

现在在第一次尝试阻止,如果发生错误,则事务被回滚。但是在调用了context.setrollbackonly()之后,不会执行try block transaction。 抛出的异常是事务回滚。

2 个答案:

答案 0 :(得分:0)

这是预期的行为。事务边界位于Container Managed Transactions的方法级别。我假设的writeLog也是一个db insert也将被回滚。在这种情况下,您应该考虑使用JTA,或者在启动呼叫的客户端作为异常处理的一部分,在单独的调用中编写数据库插入。

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

答案 1 :(得分:0)

由于整个当前事务都标记为回滚,因此第二次调用EJB也将被回滚。您必须使用@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)作为RPMRequestSessionBeanRemote bean,具体取决于您是否还需要进行交易。