起因

学习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. Python脚本调用Django内容

    一.添加系统的环境变量 1.需要引用os模块中environ关键字,其中'mybbs.settings'表示是django项目下的setings文件 eg: import os os.environ[ ...

  2. 4.MySQL 主主(m-m) 同步生产库标准同步操作实施流程

    通过MySQL参数配置使用主主前提: 1.表的主键自增. ################################################################# #m1-m ...

  3. error LNK2001: 无法解析的外部符号

    1.错误描述 error LNK2001: 无法解析的外部符号 "__declspec(dllimport) void __cdecl PadSystem::Private::printQS ...

  4. 第10章 Shell编程(1)_正则表达式

    1. 基础的正则表达式 1.1 正则表达式与通配符 (1)正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式. (2)通配符用来匹配符合条件的 ...

  5. java.io.NotSerializableException: test.io.file.Student

    java.io.NotSerializableException: test.io.file.Student    at java.io.ObjectOutputStream.writeObject0 ...

  6. VPN 部署方案

    VPN 对比: OpenVPN: 客户端连接太麻烦,放弃 PPTP VPN:版本较高的苹果手机没有 PPTP VPN 的连接方式,放弃 L2TP VPN:支持所有平台,客户端连接容易,最终选择部署 L ...

  7. LCX端口转发实现内网突破

    工具:lcx.exe 原理:当目标主机仅开放了web服务,而该服务又仅能供内网用户使用,外网用户根本无法直接访问.因此想要让外网用户能能够访问局域网中的系统服务,必须进行端口映射等操作才行.其原理就是 ...

  8. HTML5使用jplayer播放音频、视频

    首先推上神器 jPlayer:基于HTML5/Flash的音频.视频播放器 jPlayer是一个JavaScript写的完全免费和开源 (MIT) 的jQuery多媒体库插件 (现在也是一个Zepto ...

  9. vi安装Vundle+YouCompleteMe+注释快捷'scrooloose/nerdcommenter'

    Vundle is short for Vim bundle and is a Vim plugin manager. 从git上下载vundle $ git clone https://github ...

  10. [LeetCode] Set Matrix Zeroes 矩阵赋零

    Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. click ...