zoukankan      html  css  js  c++  java
  • Spring学习记录1--@Transactional Propagation

    起因

    学习Spring的时候就知道aop有一个应用是声明式注解..反正往Service上一丢@Transactional就完事了..不用自己去开启hibernate的session,很简单.

    但是@Transactional里有很多属性一直没有用过...其中最让我在意的便是Propagation属性...其他属性都还是蛮好理解的..但是这个属性一直不怎么懂,也一直没怎么去研究..

    大部分情况下的确是使用@Transactional不用额外设置就OK了.因为默认的Propagation是Propagation.REQUIRED.那其他的Propagation到底有什么作用呢?

    网上的介绍都大同小异..只有一些简单的介绍..看的我还是有点晕...所以我实践了一下...贴出实验结果...

    实验步骤

    我主要实验了3种情况..这三种情况我觉得是最容易弄错的...其他的Propagation还是比较好理解的...

    具体实验步骤是我写了2个嵌套的Service.外侧的Service用的是Propagation.REQUIRED.内侧的Service分别试了Propagation.REQUIRED, Propagation.REQUIRES_NEW 和 Propagation.NESTED

    请注意外层Service在调用内层Service的时候用了trycatch..不然内层抛出异常外层不处理的话也会抛出异常.

    我的Service看起来是这样的:

     1     @Transactional(propagation = Propagation.REQUIRED)
     2     public void operate1() {
     3         House s = new House();
     4         s.setName("841o1");
     5         repository.save(s);
     6         try{
     7             service.operate2();
     8         }catch (Exception e) {
     9             e.printStackTrace();
    10         }
    11         House s3 = new House();
    12         s3.setName("843o1");        
    13         repository.save(s3);
    14         throw new RuntimeException();
    15     }
    1     @Transactional(propagation = Propagation.NESTED)
    2     public void operate2() {
    3         House s = new House();
    4         s.setName("842o2");
    5         repository.save(s);
    6         //throw new RuntimeException();
    7     }

    流程就是外侧Service保存对象1,内侧Service保存对象2,外侧Service保存对象3

    实验结果

      外层Service抛出异常 内层Service抛出异常
    内层Service是Propagation.REQUIRED 对象1,2,3全部回滚 对象1,2,3全部回滚
    内层Service是Propagation.REQUIRES_NEW  对象1,3回滚,2成功提交 对象1,3提交成功,2回滚
    内层Service是Propagation.NESTED 对象1,2,3全部回滚 对象1,3提交成功,2回滚

    结论

    Propagation.REQUIRED : 内外层事务可以看成是同一个事务,一起commit,或者一起rollback.

    Propagation.REQUIRES_NEW : 内外层事务完全不相关, 就是2个事务

    Propagation.NESTED : 外层事务commit内层事务才可能commit,外层事务rollback内层事务一定rollback..外层事务commit,内层事务仍然可能会rollback

    另外:

    我用Spring data jpa实验Propagation.NESTED的时候提示我jpa的实现(hibernate)不支持savepoint.

    我直接用hibernate的时候就可以,但是要设置org.springframework.orm.hibernate4.HibernateTransactionManager的nestedTransactionAllowed属性为true

  • 相关阅读:
    python处理url中的中文编码,以及其他编码问题
    深度学习与神经网络
    Windows下为64位的python3.4.3安装numpy
    TOP 10开源的推荐系统简介
    遗传算法
    java调用c++生成的动态和静态库时遇到的问题
    java程序(一)----HashMap同时获取键值
    Deep Learning In NLP 神经网络与词向量
    word2vec使用说明
    Spring入门_02_属性注入
  • 原文地址:https://www.cnblogs.com/abcwt112/p/5340897.html
Copyright © 2011-2022 走看看