首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >容器管理事务RollBack

容器管理事务RollBack
EN

Stack Overflow用户
提问于 2015-01-08 07:01:03
回答 2查看 634关注 0票数 0

我有一个无死会话bean,其方法如下:

代码语言:javascript
复制
 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块事务。引发的异常是事务回滚。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-08 09:57:44

由于整个当前事务被标记为回滚,所以对EJB的第二次调用也将被回滚。您必须将@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)用于您的RPMRequestSessionBeanRemote bean,这取决于您是否也需要那里的事务。

票数 0
EN

Stack Overflow用户

发布于 2015-01-08 07:11:01

这就是人们所期望的行为。事务边界位于容器管理事务的方法级别。我认为是db插入的writeLog也将被回滚。在这种情况下,您应该考虑使用JTA,或者在单独的调用中写入db insert,作为发起调用的客户端处理异常的一部分。

代码语言:javascript
复制
EJB 1 (Requires){
    try{
      call EJB2 (requires new)
      //throw exception 
    }catch (handle EJB2 exception){
       writeLogInDB();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27834617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档