在Java EE中,在执行事务性业务方法期间引发的异常导致事务回滚。 但是,只有系统异常(即运行时异常)才是这种情况,该方法异常未在方法签名中声明。
对于应用程序异常(即检查的异常)或任何带@ApplicationException
注释的异常,不会自动回滚事务。 有时这会引起企业开发人员的困惑。
对于EJB业务方法,还可以通过指定@ApplicationException(rollback = true)
来强制事务回退应用程序异常。 但是,仅当EJB中的托管bean时才考虑使用此注释。
CDI还可以使用@Transactional
事务上执行业务方法。 此注释使我们拥有更多控制权。 使用@Transactional
我们不仅可以定义事务类型,例如REQUIRED
或REQUIRES_NEW
,而且可以定义我们要回滚或不希望回滚的异常类型:
public class CarManufacturer {@InjectCarFactory carFactory;@InjectEvent<CarCreated> createdCars;@PersistenceContextEntityManager 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
发生CarCreationException
,事务将被回滚,但不是NotificationException
。
翻译自: https://www.javacodegeeks.com/2018/01/transactional-exception-handling-cdi.html