@Transactional(rollbackFor = Exception.class)下子方法异常报错Transaction rolled back because it has been marked as rollback-only找不到报错原因
时间: 2023-11-15 07:02:56 浏览: 40
当使用@Transactional(rollbackFor = Exception.class)注解时,如果子方法抛出异常,会导致整个事务回滚。但是如果子方法中使用了手动回滚TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(),则会出现Transaction rolled back because it has been marked as rollback-only这个异常。这是因为手动设置了回滚标记,导致整个事务被标记为回滚状态,无法提交。解决方法可以有以下几种:
1. 在子方法中不要手动设置回滚标记,让异常抛到上层方法中处理。
2. 在上层方法中使用try-catch捕获子方法抛出的异常,并手动设置回滚标记。
3. 检查代码中是否存在其他异常导致事务回滚,例如数据库连接异常等。
相关问题
@Transactional(rollbackFor = Exception.class)与@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)的区别
@Transactional注解用于声明事务,在Spring中常用来保证方法的执行在一个事务内部,以确保数据的一致性和完整性。其中,rollbackFor参数指定哪些异常需要回滚事务,Propagation.REQUIRED指定了方法的事务传播行为。
区别如下:
- @Transactional(rollbackFor = Exception.class):这个注解只指定了回滚的异常类型,而没有指定传播行为,默认传播行为是Propagation.REQUIRED。
- @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class):这个注解指定了方法的事务传播行为和回滚的异常类型。
简单来说,前者只指定了回滚异常类型,而后者不仅指定了回滚异常类型,还明确指定了事务的传播行为。
DefaultTransactionDefinition().setPropagationBehavior包含@Transactional(rollbackFor = Exception.class)方法,冲突
`DefaultTransactionDefinition().setPropagationBehavior`方法和`@Transactional(rollbackFor = Exception.class)`注解之间没有冲突。它们分别用于不同的目的。
`DefaultTransactionDefinition().setPropagationBehavior`方法是用于设置事务的传播行为,它决定了在方法调用链中如何处理事务。例如,如果一个方法A调用了另一个方法B,那么事务的传播行为决定了B方法是否在A方法的事务中运行。
`@Transactional(rollbackFor = Exception.class)`注解是用于声明一个方法需要在事务中运行,并且在遇到指定的异常时回滚事务。`rollbackFor = Exception.class`表示遇到任何异常都会回滚事务。
因此,`DefaultTransactionDefinition().setPropagationBehavior`方法和`@Transactional(rollbackFor = Exception.class)`注解可以同时使用,它们并不冲突。
范例:<<引用:解决方法一:在@Transactional注解后面加上(rollbackFor = Exception.class) 。 引用:抛出checked exceptions时也回滚事务:@Transactional(rollbackFor=Exception.class) 。
请回答我或者给我介绍或演示一下:DefaultTransactionDefinition().setPropagationBehavior包含@Transactional(rollbackFor = Exception.class)方法,冲突?>>
`DefaultTransactionDefinition().setPropagationBehavior`方法和`@Transactional(rollbackFor = Exception.class)`注解之间没有冲突。它们分别用于不同的目的。
`DefaultTransactionDefinition().setPropagationBehavior`方法是用于设置事务的传播行为,它决定了在方法调用链中如何处理事务。例如,如果一个方法A调用了另一个方法B,那么事务的传播行为决定了B方法是否在A方法的事务中运行。
`@Transactional(rollbackFor = Exception.class)`注解是用于声明一个方法需要在事务中运行,并且在遇到指定的异常时回滚事务。`rollbackFor = Exception.class`表示遇到任何异常都会回滚事务。
因此,`DefaultTransactionDefinition().setPropagationBehavior`方法和`@Transactional(rollbackFor = Exception.class)`注解可以同时使用,它们并不冲突。