起因

学习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看起来是这样的:

     @Transactional(propagation = Propagation.REQUIRED)
public void operate1() {
House s = new House();
s.setName("841o1");
repository.save(s);
try{
service.operate2();
}catch (Exception e) {
e.printStackTrace();
}
House s3 = new House();
s3.setName("843o1");
repository.save(s3);
throw new RuntimeException();
}
     @Transactional(propagation = Propagation.NESTED)
public void operate2() {
House s = new House();
s.setName("842o2");
repository.save(s);
//throw new RuntimeException();
}

流程就是外侧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

Spring学习记录1--@Transactional Propagation的更多相关文章

  1. 我的Spring学习记录(四)

    虽然Spring管理这我们的Bean很方便,但是,我们需要使用xml配置大量的Bean信息,告诉Spring我们要干嘛,这还是挺烦的,毕竟当我们的Bean随之增多的话,xml的各种配置会让人很头疼. ...

  2. 我的Spring学习记录(五)

    在我的Spring学习记录(四)中使用了注解的方式对前面三篇做了总结.而这次,使用了用户登录及注册来对于本人前面四篇做一个应用案例,希望通过这个来对于我们的Spring的使用有一定的了解. 1. 程序 ...

  3. 我的Spring学习记录(二)

    本篇就简单的说一下Bean的装配和AOP 本篇的项目是在上一篇我的Spring学习记录(一) 中项目的基础上进行开发的 1. 使用setter方法和构造方法装配Bean 1.1 前期准备 使用sett ...

  4. Spring 学习记录3 ConversionService

    ConversionService与Environment的关系 通过之前的学习(Spring 学习记录2 Environment),我已经Environment主要是负责解析properties和p ...

  5. Spring 学习记录8 初识XmlWebApplicationContext(2)

    主题 接上文Spring 学习记录7 初识XmlWebApplicationContext refresh方法 refresh方法是定义在父类AbstractApplicationContext中的. ...

  6. Spring 学习记录6 BeanFactory(2)

    主题 除了Spring 学习记录5 BeanFactory 里写的几个接口外,BeanFactory的实现类还实现了一些其他接口,这篇文章主要介绍这些接口和实现类. 结构 DefaultListabl ...

  7. Spring学习记录(九)---通过工厂方法配置bean

    1. 使用静态工厂方法创建Bean,用到一个工厂类 例子:一个Car类,有brand和price属性. package com.guigu.spring.factory; public class C ...

  8. Spring学习记录(七)---表达式语言-SpEL

    SpEL---Spring Expression Language:是一个支持运行时查询和操作对象图表达式语言.使用#{...}作为定界符,为bean属性动态赋值提供了便利. ①对于普通的赋值,用Sp ...

  9. 我的Spring学习记录(三)

    学习了AOP之后就可以应用一下了,所以这次我们了解一下Spring的声明式事务. 事务在我们的很多方面都可以体现,就拿我们平时的买卖活动,或者是银行的转账来说,这些活动要么是成功,要么是失败,比如:张 ...

随机推荐

  1. hibernate注解CascadeType

    http://blog.csdn.net/strong8808/article/details/6318994(参考) CascadeType.REFRESH:级联刷新,当多个用户同时作操作一个实体, ...

  2. PHP语法(三):控制结构(For循环/If/Switch/While)

    相关链接: PHP语法(一):基础和变量 PHP语法(二):数据类型.运算符和函数 PHP语法(三):控制结构(For循环/If/Switch/While) 本文我来总结几个PHP常用的控制结构,先来 ...

  3. MySQL多实例安装

    1.安装MySQL需要的依赖的包和编译软件   (1)安装MySQL需要的依赖包 安装MySQL之前,最好先安装MySQL需要的依赖包,不然后面会出现报错,还得回来安装MySQL的依赖包. [root ...

  4. 最短路径算法-Dijkstra

    Dijkstra是解决单源最短路径的一般方法,属于一种贪婪算法. 所谓单源最短路径是指在一个赋权有向图中,从某一点出发,到另一点的最短路径. 以python代码为例,实现Dijkstra算法 1.数据 ...

  5. BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4436  Solved: 1957[Submit][Status][Discuss ...

  6. Hbase学习连接

    http://blog.csdn.net/baolibin528/article/details/43672131 http://m.blog.csdn.net/article/details?id= ...

  7. [LeetCode] Paint House 粉刷房子

    There are a row of n houses, each house can be painted with one of the three colors: red, blue or gr ...

  8. ConcurrentHashMap内存泄漏问题

    问题背景 上周,同事写了一段ConcurrentHashMap的测试代码,说往map里放了32个元素就内存溢出了,我大致看了一下他的代码及运行的jvm参数,觉得很奇怪,于是就自己捣鼓了一下.首先上一段 ...

  9. iOS学习-压缩图片(改变图片的宽高)

    压缩图片,图片的大小与我们期望的宽高不一致时,我们可以将其处理为我们想要的宽高. 传入想要修改的图片,以及新的尺寸 -(UIImage*)imageWithImage:(UIImage*)image ...

  10. 给空签名包进行签名以及找不到keystore证书链问题的解决方案

    转 http://blog.csdn.net/u011106842/article/details/49683865