Spring事务失效的原因

Spring事务失效的原因

1、注解中可以指定处理异常的类型,当遇到对应异常的时候会回滚,但是没有指明的异常,不会进行回滚,而是直接提交事务
默认只对RuntimeException和ErrorException这两个类及其子类的异常进行回滚操作。

解决方法:异常处理类型指定为Exception.class,这个类是所有异常的父类,会涵盖全部的异常。

2、业务方法内自己try-catch异常导致事务不能正常回滚。
事务通知只有捕捉到了目标抛出的异常,才能进行后续的回滚处理,但是如果方法内部自己进行了异常的处理,事务通知就无法捕捉到异常,就不会回滚。

解决方法:①在try-catch语句中对捕捉到的异常原样抛出;②在捕捉到异常以后手动设置TransactionStatus.setRollbackOnly();

3、AOP切面顺序导致事务不能正常进行回滚
事务切面优先级最低,如果自定义的切面优先级设置和事务切面优先级一样,则自定义切面还是在内层,如果自定义切面没有正确的抛出异常,事务切面仍然无法处理。

解决方法:①在try-catch语句中对捕捉到的异常原样抛出;②在捕捉到异常以后手动设置TransactionStatus.setRollbackOnly();

4、非public方法导致事务失效
Spring为方法创建代理、添加事务通知,这些的前提都是方法是pubic的

解决方法:改成public方法

5、父子容器导致的事务失效
子容器扫描范围过大,把没加事务配置的service扫描进来
解决方法:每个容器各司其职,不要扫描到其他容器负责的部分

你可能感兴趣的:(学习笔记,spring,java,后端)