一、 访问符非public
1. 改为public
2. 开启AspectJ代理
注: static和final会导致动态无法代理,导致事务不生效;动态代理的方式有两种:JDK动态代理,cglib代理,static使method属于类而不属于任何对象,即使写法上是重写,也没有重写的含义,即重写static方法是没有意义的
二、 @Transactional抛出的异常并非是spring事务支持的异常。如:Exception
1. rollback=Exception.class
2. throw new RuntimeException
注:只支持uncheck的Exception
三、 数据库不支持的事务
mysql中的MyISAM是不支持事务的,InnoDB是支持事务的
四、@Service被注释
不被spring管理的是不支持事务的
五、 异常被捕获
1. 捕获的异常再抛出
六、 方法自身调用问题(非事务方法调用事务;自己调用自己)
1. 拆分
2. 自己注入自己,调用实例
3. 获取代理类(AopContext.currentProxy().method)
七、 数据源没有配置事务管理器
八、传播类型不支持事务
九、 多线程调用
多线程分为(1、继承Thread;2、实现Runable;3、实现Callable和Future(实现Callable接口后,用FutureTask包装Callable类,然后用Thread封装Future,最后使用start启动))
在方法上使用REQUIRES_NEW作为隔离等级,在调用方法上使用@Transactional开启事务
隔离类型
1. required 没有事务就新建,有就加入
2. support 有加入,没有就无事务执行
3. mandatory 没有事务就抛出异常
4. required_new 有事务就建一个新的事务
5. not_support 有事务就挂起,以非事务执行
6. never 以非事务执行,有就抛出异常
7. nested 有事务就嵌套执行,没有就建一个新的事务
required_new新事物执行完就会提交,但是nested会等待最外层的事务执行完再提交
嵌套事务分为父子事务:
父事务提交的时候,子事务也提交
父事务回退的时候,子事务也回退
但是子事务的回退不会影响到父事务
标签:事务,场景,代理,Callable,调用,static,失效,异常 From: https://www.cnblogs.com/cambra/p/17135283.html