您不能使用 @Transactional 为应用程序级别执行此操作,但您可以:
variant 1 : 扩展@Transactional 注释并将其作为rollbackfor 的默认值。但是只设置你需要的rollbackFor unchecked exceptions。有了这个,你可以控制回滚只在你确定的情况下,并避免复制过去@Transactional(rollbackFor =MyCheckedException.class)
喜欢:
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional(rollbackFor=MyCheckedException.class)
public @interface TransactionalWithRollback {
}
并使用这个注解代替标准的@Transactional。
变体2:您可以从AnnotationTransactionAttributeSource创建扩展并覆盖方法determineTransactionAttribute:
protected TransactionAttribute determineTransactionAttribute(AnnotatedElement ae)
//Determine the transaction attribute for the given method or class.
TransactionAttribute 见TransactionAttribute api,有方法
boolean rollbackOn(Throwable ex) 我们应该回滚给定的异常吗?
protected TransactionAttribute determineTransactionAttribute(
AnnotatedElement ae) {
return new DelegatingTransactionAttribute(target) {
@Override
public boolean rollbackOn(Throwable ex) {
return (check is exception type as you need for rollback );
}
};
}
第二种方法不如第一种好,因为它对事务管理器来说确实是全局的。更好地使用自定义注释,因为您可以控制它,仅适用于您真正需要它的方法/类。但是,如果您在任何情况下都需要它,请使用第二种变体,这将是您的默认跨国行为。