美文网首页探索Spring
Spring事务原理分享小结

Spring事务原理分享小结

作者: Real_man | 来源:发表于2019-02-22 08:12 被阅读13次

原本以为自己看了这么久的源码,分享效果应该不错,但是发现不是这样的,大部分人都是处于以为自己知道,实际上自己似是而非的情况。虽然细节,大的主线自己比较清楚,但是在告诉大家的时候,不是所有人的理解程度都和自己一样。

可能自己在讲的时候,大家以为自己理解了,但是推敲推敲,就能提出很多的疑问,如果将的范围比较大,就容易把自己也绕晕了。

事务不生效的几个结论

  1. private,protect方法事务不生效
  2. final修饰符修饰的方法和类不生效。
  3. 在当前的bean中,没有加上事务的方法调用有事务的方法不生效。如下,调用index方法,save方法上的事务不生效。
    public String index(@RequestParam("name") String name,
                        @RequestParam("age") Integer age,
                        @RequestParam("id") Integer id
                        ){
        save(name,age,id);
        return "index";
    }

    @RequestMapping("/tx")
    @ResponseBody
    @Transactional
    public String save(@RequestParam("name") String name,
                       @RequestParam("age") Integer age,
                       @RequestParam("id") Integer id){
        System.out.println("hello");
        jdbcTemplate.update("insert into user(id,name,age)values(" + id + ",'"+name+"',"+age+")");
        jdbcTemplate.update("insert into user(id,name,age)values(2,'"+name+"',"+age+")");
        return "tx";
    }

疑问

  1. CGLib动态代理时,为什么private方法和protect方法是不生效的呢?

    大家为了方便记忆,都会说CGLib的动态代理是基于继承的实现,而子类无法访问private方法,所以不生效。实际这是错误的

    真实情况,CGLib可以修改字节码,在子类中实现动态代理是完全可以的,之所以没有生效则是因为Spring的事务注解在被Spring解析的时候,Spring会判断事务的方法是不是public修饰符,如果不是public修饰符的话,则不使用事务代理。

    AbstractFallbackTransactionAttributeSource类中

    image-20190221185010421
  1. 为什么final方法是不生效的呢?

    同样的原因,在Spring创建动态代理的时候,会判断方法的修饰符是不是final的方法,如果是Final方法则直接走原始的方法,而不经过代理方法。

    另外不经过Spring的CGLib也不会代理final的方法

    CGLibAopProxy的ProxyFilter类。 假设读者对Enhancer很熟悉了

    image-20190221190217926
  1. 另外还有问题

    Spring生成的动态代理与代理的对象是两个Bean吗?一个Bean包装了原本的bean

    注入的时候注入的是代理Bean还是实际的Bean?代理Bean

    Aop的增强(Advice)和Proxy是什么关系?分JDK和CGLib,一般代理与增强是合成的...

    多个AOP切到同一个切点的时候如何处理?获取拦截链,一个个执行

总结

分享的时候有疑问肯定是正常的,分享与做需求一样,要明白听众的需求是什么,能不能解决听众的需求。在自己看的时候,主线是正常的,分享的时候有疑问抛出来,才能检查自己是不是真的懂了这个知识点。

我讲的时候有几个讲的不好的地方:

  • 讲的东西太多,原本只是讲Spring不生效原理,结果之外又说了Spring Bean生命周期,其它的东西去了,讲的点多,就没办法把一个点将的让大家很明白。
  • 在看的时候,自己给自己提的问题少,一旦大家一起提疑问的时候,能发现有的自己搞的不是很明白。

不过也好,对Spring事物处理这块有更多的理解了。

相关文章

  • Spring事务原理分享小结

    原本以为自己看了这么久的源码,分享效果应该不错,但是发现不是这样的,大部分人都是处于以为自己知道,实际上自己似是而...

  • Spring事务完全解析

    事务是什么?了解事务的原理吗?说下Spring的事务原理,能自己实现Spring事务原理吗?先自我检测下这些知识掌...

  • Spring事物原理完全解析

    事务是什么?了解事务的原理吗?说下Spring的事务原理,能自己实现Spring事务原理吗?先自我检测下这些知识掌...

  • 程序员之Spring

    1. Spring事务 spring的事务实现原理Spring事务将connection放入到当前线程的threa...

  • 分布式事务(2)Spring事务

    2.1 Spring事务原理 Spring支持编程式事务和声明式事务。编程式事务就是用个事务类Transactio...

  • spring 事务

    本章探索spring事务的原理需要知道spring事务的原理,就必须先理解spring AOP在我之前的文章有讲解...

  • spring事务的实现原理

    spring实现事务的原理 Spring事务 的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring...

  • 转:Spring IOC和AOP 原理彻底搞懂

    本博中关于spring的文章:Spring IOC和AOP原理,Spring事务原理探究,Spring配置文件属性...

  • 2018-06-09

    spring源码分析(八) 目录五、源码分析--6、Spring 事务原理详解----6.1、什么是事务(Tran...

  • Spring事务传播机制

    1.Spring事务执行的原理; Spring事务使用AOP的机制实现,会在@Transcactional注解修饰...

网友评论

    本文标题:Spring事务原理分享小结

    本文链接:https://www.haomeiwen.com/subject/locsyqtx.html