做门户网站怎么赚钱,上海做网站推广关键词,出入郑州最新通知今天,河南省最新通知类内部访问导致事务不生效原因#xff1a; 注解Transaction的底层实现是Spring AOP技术#xff0c;而Spring AOP技术使用的是动态代理。spring事务失效的原因就是动态代理失效的原因:
对于static方法和非public方法#xff0c;注解Transactional是失效的#xff0c;因为不…类内部访问导致事务不生效原因 注解Transaction的底层实现是Spring AOP技术而Spring AOP技术使用的是动态代理。spring事务失效的原因就是动态代理失效的原因:
对于static方法和非public方法注解Transactional是失效的因为不会代理并拦截这些方法。子调用直接this调用带有事务方法也因为直接调用自身对象的方法直接在目标对象内部执行不经过代理因此事务也失效。 还有目标对象实例化吗
主要讲解 4 种事务不生效的 Case
类内部访问A 类的outer方法没有标注 Transactionalinner方法标注 Transactional在 outer 里面直接调用inner(如用this.关键字)私有方法将 Transactional 注解标注在非 public 方法上异常不匹配Transactional 未设置 rollbackFor 属性而方法返回 Exception 等异常或是事务方法内部产生的异常被catch后没有向外部抛出多线程主线程和子线程的调用线程抛出异常
即使Spring已经管理了某个事务方法即为这个方法创建了代理当这个方法内部调用私有方法时这个私有方法的调用仍然会绕过代理对象 原来不止创建了代理对象还有目标对象的吗还是说先创建目标对象再创建代理当在包装的代理中使用invoke的时候是不是已经是目标对象亲自操作了 似乎这里要先看spring启动、创建bean的原理
我目前的想法与可能的误区 Bean都是代理对象注入的都是代理 是的注入的都是实现了同一接口的Spring代理因此他们也拥有接口中定义的方法用起来就像真正的对象一样。 如果是的话那还要真正的目标对象干什么什么时候创建的真正对象从创建代理的 private Object target;来看目标对象还是被创建了。当我们this子调用的时候虽然外部outer方法是调用的代理类的但是代理方法内部还是调用了目标对象的原方法而在其中的this调用是不经过代理对象的。 但我记得反射是可以打破私有的限制的为什么无法代理私有方法 答接口忘了有没有私有方法反正不会被目标对象实现。jdk动态代理是通过接口生成代理对象自然不会有目标对象的私有方法。
被代理方法调用私有方法私有方法了里的mapper进行数据库操作会和父方法在一个连接里吗是的话又在一个事务管理器里吗调用mapper方法的时候是怎么选择连接
解决方法
事务自调用 Resource 获取自己的代理对象 编程式事务管理TransactionTemplate
异常控制
请回忆动态代理用代理类包裹了原方法。因此目标类方法中产生的异常可以传递到代理类 对于一个被标记了Transactional的方法 如果内部发生异常但是自己有catch语句可以考虑在catch块中做相应处理这样异常不会被扔出方法也就不会被外部的代理对象捕获也就不会回滚 如果catch后仍然想回滚就再手动throw异常或者使用编程式事务管理编写代码TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();来让当前事务回滚。
多线程事务
Spring事务管理的传播机制是使用 ThreadLocal 实现的。因为 ThreadLocal 是线程私有的所以 Spring 的事务传播机制是不能够跨线程的。 根据结果统一回滚。不过太复杂了不如手动处理。这个业务也挺少见我都后悔记这一章节笔记了。