1.并不是service层写了try catch ,事务就不好使了。

图片说明
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
catch中加入这段代码,事务就可以正常回滚了。

2.spring中如果手动抛出异常,只有抛出运行时异常,事务才会回滚。
图片说明

(1).运行时异常事务可以正常回滚;
如果是其他异常,正常事务是不需要回滚的,如果也要求回滚,需要加入下面的代码:
图片说明

图片说明

@Transactional(rollbackFor=Exception.class)
Exception是基类,抛出小级别异常也可以正常事务回滚;

(3).service层抛出异常,一定要在controller捕获异常处理,不然报错会直接返回给前台界面。

图片说明

如果不捕获,控制层就是这样的代码:
图片说明
此时异常就会跑到界面上,程序不能继续执行了。如果不捕获异常,最高级别只会抛出异常,程序也走不了了。

图片说明

(4).如果方法调用的方法中有捕获异常,而且加了回滚的字段,也是可以正常回滚的。
图片说明
图片说明

(5).方法A调用方法B,方法B里面捕获异常,并且抛出异常,那么会返回给A方法,A方法里面增加对异常的事务处理,就可以让事务正常回滚。
图片说明

图片说明

请参照下面事务回滚的博客详解
https://www.cnblogs.com/zjfjava/p/9963958.html