service层设置手动事务回滚,原因@Transactional事务与try{}catch(){}会失效,导事务不回滚
1、原因是这样的,在service层的方法中,需要执行多条update或insert的数据操作,service的方法上是加@Transactional(rollbackFor = Exception.class)注解,然后方法体中又用了try{}catch(){}操作,导致在update多个执行时,其中有一条sql报错,本应该执行事务回滚操作报错前的update都不应该生效,但一看数据库表,已经生效了。
这就导致回滚是无效的。
那么我们就直接使用手动回滚好了,在执行数据表操作后面加上,手动事务回滚代码(亲测有效)
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
示例,如图:
去掉方法上@Transactional(rollbackFor = Exception.class) 注解,使用手动事务回滚
批量执行sql时,其中一条报错,所有事务回滚,报错前执行的事务也将无效。
。