广州金山大厦 网站建设,济南网站建设公司电子商务网站,优秀网站设计书籍,广州番禺哪里有学网站建设记录spring中Transactional事务注解失效的六个场景
方法内的自调用
原因#xff1a;通过this内部调用其他带有Transactional注解的方法#xff0c;是通过this进行调用#xff0c;并没有通过cglib代理对象进行调用#xff0c;导致方法未被增强导致无法检测内部事务 解决方…记录spring中Transactional事务注解失效的六个场景
方法内的自调用
原因通过this内部调用其他带有Transactional注解的方法是通过this进行调用并没有通过cglib代理对象进行调用导致方法未被增强导致无法检测内部事务 解决方法通过实现类内部自己注入自己的bean实现调用内部方法以调用cglib增强的代理方法。或者通过AopContext.currentProxy()获取当前代理对象使用之前需要引aspectjweaver依赖并且需要在启动类上加入EnableAspectJAutoProxy(exposeProxytrue)注解。或者在调用方加入Transactional注解
方法是private的
原因spring基于cglib进行AOPcglib基于父子类来实现的子类是代理类父类是被代理类如果父类某个方法是被private修饰子类的类没法拿到父类的方法所以导致方法无法被cglib代理进而无法使用代理方法 解决方法使用public
方法是final的
原因因为代理需要重写方法但是final方法无法被重写所以无法被代理而无法被代理所以就无法使用Transactional注解来管理事务 解决方法去掉final
单独的线程调用方法
原因事务是跟连接绑定的而一个连接是一个线程新开了一个线程等于新开了一个事务两个线程的事务管理不同
异常被吃掉
原因事务回滚是根据异常进行的手动进行异常处理不会回滚事务
类没被spring管理
原因没进行bean注入直接new无法使用spring的事务管理
管理事务的方式
1.使用编程式事务beginTransaction(), commit(), rollback() 2.基于TransactionProxyFactoryBean的声明式事务管理 3.基于Transactional的声明式事务管理 4.基于Aspectj AOP配置事务 5.使用分布式事务进行管理2PC3PC、TCC
如何避免事务失效
1.使用编程式事务手动提交 2.避免慢查询 3.不要再事务中加入耗时操作如rpc大批量插入修改等