Sring事务原理分享小结

栏目: Java · 发布时间: 5年前

内容简介:原本以为自己看了这么久的源码,分享效果应该不错,但是发现不是这样的,大部分人都是处于以为自己知道,实际上自己似是而非的情况。虽然细节,大的主线自己比较清楚,但是在告诉大家的时候,不是所有人的理解程度都和自己一样。可能自己在讲的时候,大家以为自己理解了,但是推敲推敲,就能提出很多的疑问,如果将的范围比较大,就容易把自己也绕晕了。分享的时候有疑问肯定是正常的,分享与做需求一样,要明白听众的需求是什么,能不能解决听众的需求。在自己看的时候,主线是正常的,分享的时候有疑问抛出来,才能检查自己是不是真的懂了这个知识点

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

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

事务不生效的几个结论

  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类中

    Sring事务原理分享小结
  2. 为什么final方法是不生效的呢?

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

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

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

    Sring事务原理分享小结
  3. 另外还有问题

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

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

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

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

总结

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

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

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

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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Foundations of PEAR

Foundations of PEAR

Good, Nathan A./ Kent, Allan / Springer-Verlag New York Inc / 2006-11 / $ 50.84

PEAR, the PHP Extension and Application Repository, is a bountiful resource for any PHP developer. Within its confines lie the tools that you need to do your job more quickly and efficiently. You need......一起来看看 《Foundations of PEAR》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具