在 Java EE 中,在执行事务性业务方法期间引发的异常会导致事务回滚。但是,这只是系统异常,即运行时异常,没有在方法签名中声明。
对于应用异常,即checked异常,或者任何用@ApplicationException
注解的异常,事务不会自动回滚。这有时会在企业开发人员中引起混淆。
对于 EJB 业务方法,也可以通过指定 @ApplicationException(rollback = true)
强制事务在应用程序异常时回滚。但是,仅当 EJB 中的托管 bean 时才考虑此注释。
CDI 还可以使用 @Transactional
以事务方式执行业务方法。这个注解给了我们更多的控制权。使用 @Transactional
我们不仅可以定义事务类型,例如 REQUIRED
或 REQUIRES_NEW
,还可以定义我们想要或不想要的异常类型回滚:
public class CarManufacturer { @Inject CarFactory carFactory; @Inject Event<CarCreated> createdCars; @PersistenceContext EntityManager entityManager; @Transactional(rollbackOn = CarCreationException.class, dontRollbackOn = NotificationException.class) public Car manufactureCar(Specification specification) { Car car = carFactory.createCar(specification); entityManager.persist(car); createdCars.fire(new CarCreated(car.getIdentification())); return car; } }
如果 CarCreationException
发生,事务将回滚,但 NotificationException
不会。
标签2: Java教程地址:https://www.cundage.com/article/jcg-transactional-exception-handling-cdi.html