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看起来是这样的:
@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的更多相关文章
- 我的Spring学习记录(四)
虽然Spring管理这我们的Bean很方便,但是,我们需要使用xml配置大量的Bean信息,告诉Spring我们要干嘛,这还是挺烦的,毕竟当我们的Bean随之增多的话,xml的各种配置会让人很头疼. ...
- 我的Spring学习记录(五)
在我的Spring学习记录(四)中使用了注解的方式对前面三篇做了总结.而这次,使用了用户登录及注册来对于本人前面四篇做一个应用案例,希望通过这个来对于我们的Spring的使用有一定的了解. 1. 程序 ...
- 我的Spring学习记录(二)
本篇就简单的说一下Bean的装配和AOP 本篇的项目是在上一篇我的Spring学习记录(一) 中项目的基础上进行开发的 1. 使用setter方法和构造方法装配Bean 1.1 前期准备 使用sett ...
- Spring 学习记录3 ConversionService
ConversionService与Environment的关系 通过之前的学习(Spring 学习记录2 Environment),我已经Environment主要是负责解析properties和p ...
- Spring 学习记录8 初识XmlWebApplicationContext(2)
主题 接上文Spring 学习记录7 初识XmlWebApplicationContext refresh方法 refresh方法是定义在父类AbstractApplicationContext中的. ...
- Spring 学习记录6 BeanFactory(2)
主题 除了Spring 学习记录5 BeanFactory 里写的几个接口外,BeanFactory的实现类还实现了一些其他接口,这篇文章主要介绍这些接口和实现类. 结构 DefaultListabl ...
- Spring学习记录(九)---通过工厂方法配置bean
1. 使用静态工厂方法创建Bean,用到一个工厂类 例子:一个Car类,有brand和price属性. package com.guigu.spring.factory; public class C ...
- Spring学习记录(七)---表达式语言-SpEL
SpEL---Spring Expression Language:是一个支持运行时查询和操作对象图表达式语言.使用#{...}作为定界符,为bean属性动态赋值提供了便利. ①对于普通的赋值,用Sp ...
- 我的Spring学习记录(三)
学习了AOP之后就可以应用一下了,所以这次我们了解一下Spring的声明式事务. 事务在我们的很多方面都可以体现,就拿我们平时的买卖活动,或者是银行的转账来说,这些活动要么是成功,要么是失败,比如:张 ...
随机推荐
- 管理者与下属谈话的技巧及注意点[持续更新ing]
1.谈话之前要明确谈话的内容.原则和目的(为什么谈,谈什么,要解决什么事) 2.谈话时间不宜过长,尽量控制在半小时以内,最好在每一个阶段或一个节点的时间上去谈 3.谈话单次内容不能过多,但要捉住重点, ...
- T-SQL 去除特定字段的前导0
在工作过程中遇到一个需求,要从特定字段中删除前导零,这是一个简单的VARCHAR(10)字段. 例如,如果字段包含"00001A",则SELECT语句需要将数据返回为"1 ...
- Oracle学习笔记十一 游标
游标的简介 游标的概念 游标是从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用fetch语句可以移动该指针,从而对游标中的数据进行各种操作 ...
- python-pickle模块使用实例
以下代码主要实现的是用户登录,注册,密码验证,账户锁定,重置和修改密码等功能 import pickle #第一次运行请去掉下面一段代码的注释 ''' users_db = open("us ...
- Fedora javac 命令提示 [javac: 未找到命令...]
[joy@localhost ~]$ java -version openjdk version "1.8.0_91" OpenJDK Runtime Environment (b ...
- AJAX提交方法(POST)Demon
AJAX的POST提交方法,本质上来看和GET差不多,有些细小的区别,POST要提交数据时,需要setRequestHeader()方法来提交HTTP头,然后send()方法中提交数据(格式为:&qu ...
- Animator Controller 继承关系
准备知识 对于Animator Controller中蜘蛛网一样的几十条连线,后续如果靠人工维护,那成本将是很大. AnimatorOverrideController组件的文档:https://do ...
- [LeetCode] Battleships in a Board 平板上的战船
Given an 2D board, count how many different battleships are in it. The battleships are represented w ...
- [板子]ISAP
ISAP求最大流,敲了一发板子,无压行,教程略去.转载请随意. #include <cstdio> #include <cstring> #include <algori ...
- mysq大数据分页
mysql limit大数据量分页优化方法 Mysql的优化是非常重要的.其他最常用也最需要优化的就是limit.Mysql的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急 ...