首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EJB 3事务回滚问题

EJB 3事务回滚问题
EN

Stack Overflow用户
提问于 2016-07-29 20:08:08
回答 2查看 601关注 0票数 0

我有以下代码:

代码语言:javascript
复制
        @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
        public Car prepareCar(Data data) throws CarServiceException{
          Car car = null;
          try {
            car = carManagerBean.createCar(data);
            Driver driver = createDriver();
            car.setDriver(driver);
          } catch (Exception e) {
            LOGGER.error(e.getMessage, e);
            context.setRollbackOnly();
            throw new CarServiceException(e);
          }
          return car;
         }

问题是,如果在尝试部分(例如SQLServerException)中出现一些问题,则不会执行catch部分,也不会抛出CarServiceException。有人知道这段代码可能出了什么问题吗?但无论如何,事务都会被回滚。只有当我移动try-catch块来包装方法调用时,它才能工作。

EN

回答 2

Stack Overflow用户

发布于 2016-07-29 21:05:15

您希望捕获事务外部的异常。执行以下操作:

代码语言:javascript
复制
@Stateless
public class CarServiceDelegate {

   @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
   public Car prepareCar(Data data) throws CarServiceException{
      Car car = carManagerBean.createCar(data);
      Driver driver = createDriver();
      car.setDriver(driver);
      return car;
   }
}

public class CarService {

   @EJB
   private CarServiceDelegate carServiceDelegate;

   public Car prepareCar(Data data) {
       try {
           return carServiceDelegate.prepareCar();
       } catch (Exception e) {
        // You will catch it here, when the transaction is done.
        LOGGER.error(e.getMessage, e);
        throw new CarServiceException(e);
      }
   }

}

我将更新EJb异常的哪一部分要求在事务外部传播异常。在@Asynchronous调用中也会发生类似的行为(异常被抑制)。

票数 1
EN

Stack Overflow用户

发布于 2016-07-29 20:14:18

请记住,如果catch块本身抛出异常,它将不会到达重新抛出异常的段。请注意,根据文档,如果事务不再处于活动状态,setRollbackOnly()可能会抛出IllegalStateException。您可能希望将catch块包装在另一个try/catch块中以发现这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38658462

复制
相关文章

相似问题

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