文档章节

Spring 传播行为(PROPAGATION)

年少爱追梦
 年少爱追梦
发布于 2016/04/16 15:25
字数 949
阅读 665
收藏 0
点赞 1
评论 0

                                                                        Spring 传播行为

       Spring 中定义的七种传播行为,因为Spring将事务传播行为是交给事务管理器去实现的,所以使用之前第一步就是查看我们使用的事务管理器是否支持下面的七中传播行为:

      PROPAGATION_REQUIRED - -支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。  
      PROPAGATION_SUPPORTS - -支持当前事务,如果当前没有事务,就以非事务方式执行。  
      PROPAGATION_MANDATORY - -支持当前事务,如果当前没有事务,就抛出异常。  
      PROPAGATION_REQUIRES_NEW - -新建事务,如果当前存在事务,把当前事务挂起。  
      PROPAGATION_NOT_SUPPORTED - -以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。  
      PROPAGATION_NEVER - -以非事务方式执行,如果当前存在事务,则抛出异常。  

      我使用的是:org.springframework.jdbc.datasource.DataSourceTransactionManager 并不是完全是支持这七种传播行为的所以就有很多问题,使用其他的时候一定要关注一下,开始被坑哭了(DataSourceTransactionManager 不支持 PROPAGATION_NOT_SUPPORTED PROPAGATION_REQUIRES_NEW )。

      上面提了一下七种传播行为的含义,但是只看这个似乎有一点摸不着头脑,我个人认为传播行为的存在是为了解决各个事务方法之间调用可能出现的问题,(这里就涉及理念对实际可能出现的情况做的一种抽象)。      

       举一两个例子:传播行为“PROPAGATION_MANDATORY ”这个行为的意思就调用该方法的方法必须是一个事务方法(有点绕),很多时候我们对那些非常重要的数据进行删除,修改,增加的时候我们肯定希望他们的处于事务中,改到一半失败了,这个是超级可怕的事情。这个传播行为的价值就体现出来了,保证了调用该行为的方法都是事务方法。还有"PROPAGATION_NEVER ",不允许事务方法调用该方法,因为我们知道事务方法一般是有时间限制的,像一些超级耗时间的方法,我们给他加上这个传播行为,就可以提醒事务方法不要再使用这个了(不满足特殊情况哈)。

    上面只是提到一些理念对实际的抽象,传播行为之间最奇特的还是传播行为之间的组合可以解决很多实际上容易面临的问题。

    例如:下面举的例子都要关注事务边界哈:

    PROPAGATION_REQUIRED and  PROPAGATION_REQUIRED  传播行为的组合

@Transactional(propagation=Propagation.REQUIRED ,rollbackFor=AcceptPendingException.class)
	public void testRequiredAndRequired(){
	//事务开头
		insertInfo1();//包含在了testRequiredAndRequired里面
		insertInfo2();//包含在了testRequiredAndRequired里面
	//事务结束
	}
	@Transactional(propagation=Propagation.REQUIRED)
	public void insertInfo1(){
		ud.insert(10);
	//	throw new AcceptPendingException();
	}
	
	
	@Transactional(propagation=Propagation.REQUIRED)
	public void insertInfo2(){
		ud.insert(11);
		throw new AbstractMethodError();
	}
	
	public static void main(String args[]) {
		ApplicationContext ac = new ClassPathXmlApplicationContext(
				"com/springinaction/springidol/spring-tx.xml");
		UserService us = (UserService) ac.getBean("userService");
		us.testRequiredAndRequired();
	}

    发现传播行为:PROPAGATION_REQUIRED 事务边界内只要抛出异常,结果都会回滚。

    经过测试发现:PROPAGATION_REQUIRES_NEW  传播行为是在DataSourceTransactionManager 中不支持的,和PROPAGATION_REQUIRED 行为是相同的。

    PROPAGATION_REQUIRED  and Propagation.SUPPORTS 传播行为的组合

@Transactional(propagation = Propagation.REQUIRED,readOnly = false, rollbackFor = AcceptPendingException.class)
	public void testRquiredAndSupported(){
	    //事务开始
		insertInfo1();
		insertInfo2();
	    //事务结束
	}

	@Transactional(propagation = Propagation.SUPPORTS, rollbackFor = AcceptPendingException.class)
	public void insertInfo1() {
		ud.insert(10);
		throw new  AcceptPendingException();
	}

//	@Transactional(propagation = Propagation.REQUIRES_NEW)
	public void insertInfo2() {
		ud.insertAccount(11);
	//	 throw new AbstractMethodError();
	}
	
	public static void main(String args[]) {
		ApplicationContext ac = new ClassPathXmlApplicationContext(
				"com/springinaction/springidol/spring-tx.xml");
		UserService us = (UserService) ac.getBean("userService");
		us.insertInfo1();
	}

    当只有Propagation.SUPPORTS 转播行为的时候是没有事务边界的。当PROPAGATION_REQUIRED  下的SUPPORTS 的时候这个时候事务边界就是当前方法的事务边界。

    可见我们使用传播行为的时候主要就是关注事务的边界。就和可以很好的使用传播行为了。

    

    

     


© 著作权归作者所有

共有 人打赏支持
年少爱追梦
粉丝 30
博文 184
码字总数 117928
作品 0
杭州
程序员
Spring事务传播机制

概述 当我们调用一个基于Spring的Service接口方法(如UserService#addUser())时,它将运行于Spring管理的事务 环境中,Service接口方法可能会在内部调用其它的Service接口方法以共同完成一个...

rouway
2011/07/04
0
0
spring 事务管理 2(spring的事务方法镶嵌使用,事务边界和传播性)没完

许多人认为spring一个事务方法不应该调用另一个事务方法,否则将产生两个事务,其实是没有正确理解spring的事务传播性和边界 Spring 对事务控制的支持统一在 org.springframework.transactio...

jiangtao
2012/01/09
0
0
Spring的事务管理难点剖析(3):事务方法嵌套调用的迷茫

Spring事务传播机制回顾 Spring事务一个被讹传很广说法是:一个事务方法不应该调用另一个事务方法,否则将产生两个事务。结果造成开发人员在设计事务方法时束手束脚,生怕一不小心就踩到地雷...

icheer
2012/07/17
0
0
Spring3事务管理——使用原始的TransactionProxyFactoryBean

Spring的早期版本用户必须通过TransactionProxyFactoryBean代理对需要事务管理的业务类进行代理,便于实施事务功能的增强。 让我们先看代码吧! 业务层代码: public interface UserScoreSe...

guanzhenxing
2014/03/28
0
0
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,

事务传播行为种类 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为, 它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播: 表1事务传播行为类型 事务传播行为类...

dml124
2012/09/14
0
0
Spring高级事务管理难点剖析

1Spring事务传播行为 所谓事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。Spring支持7种事务传播行为 PROPAGATION_REQUIRED(加入已有事务) 如果当前没有事务,就新建...

蛙牛
2014/08/23
0
12
Spring 事务传播行为的属性

<bean id="transactionManager" Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。 它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播。 事务传播行为类型 说明...

import_key
2015/06/29
0
0
Spring 深入理解事务原理

IT虾米的博客 一、事务的基本原理 Spring事务 的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步...

hgqxjj
06/26
0
0
脱离 Spring 实现复杂嵌套事务,之五(SUPPORTS - 跟随环境)

本文是<实现 Spring 的事务控制>系列文章中一篇。本文假设读者已经阅读并理解《实现 Spring 的事务控制,之一(必要的概念)》文中所涉及的概念(当前连接、引用计数),以及数据库连接的(n...

哈库纳
2014/02/17
0
1
spring事务和jdbc事务

Spring事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获取...

TonyStarkSir
04/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CoreText进阶(七)-添加自定义View和对其

CoreText进阶(七)-添加自定义View和对其 其它文章: CoreText 入门(一)-文本绘制 CoreText入门(二)-绘制图片 CoreText进阶(三)-事件处理 CoreText进阶(四)-文字行数限制和显示更多...

aron1992
14分钟前
0
0
Python爬虫 爬取百合网的女人们和男人们

学Python也有段时间了,目前学到了Python的类。个人感觉Python的类不应称之为类,而应称之为数据类型,只是数据类型而已!只是数据类型而已!只是数据类型而已!重要的事情说三篇。 据书上说...

p柯西
26分钟前
0
0
在Java中,你真的会日期转换吗

1.什么是SimpleDateFormat 在java doc对SimpleDateFormat的解释如下: SimpleDateFormatis a concrete class for formatting and parsing dates in a locale-sensitive manner. It allows fo......

Java小铺
34分钟前
0
0
Linux系统梳理---系统搭建(二):tomcat的安装和使用

上一章讲到JDK的安装使用,这一章主要记录下服务器tomcat的安装以及部署一个项目. 1.下载tomcat,这里下载的是apache-tomcat-8.5.32.tar.gz 2.创建文件夹,便于管理,和JDK一样,在usr目录下创建t...

勤奋的蚂蚁
45分钟前
0
0
ES15-聚合

1.Terms Aggregation 分组聚合 2.Filter Aggregation 过滤聚合

贾峰uk
46分钟前
0
0
【2018.07.19学习笔记】【linux高级知识 20.27-20.30】

20.27 分发系统介绍 20.28 expect脚本远程登录 20.29 expect脚本远程执行命令 20.30 expect脚本传递参数

lgsxp
49分钟前
0
0
10.32/10.33 rsync通过服务同步~10.35 screen工具

通过服务的方式同步要编辑配置文件:[root@linux-xl ~]# vim /etc/rsyncd.confport=873log file=/var/log/rsync.logpid file=/var/run/rsyncd.pidaddress=192.168.43.21[tes...

洗香香
52分钟前
0
0
与女儿谈商业模式 (3):沃尔玛的成功模式

分类:与女儿谈商业模式 | 标签: 经济学 沃尔玛 陈志武 2007-05-10 09:09阅读(11279)评论(30) 与女儿谈商业模式 (3):沃尔玛的成功模式 陈志武 /文 沃尔玛(Wal-Mart)是另一个有意思的财...

祖冲之
58分钟前
0
0
网页加载速度优化方法总结

1、减少请求 最大的性能漏洞就是一个页面需要发起几十个网络请求来获取诸如样式表、脚本或者图片这样的资源,这个在相对低带宽和高延迟的移动设备连接上来说影响更严重。 2、整合资源 对开发...

Jack088
今天
0
0
dubbo学习

https://blog.csdn.net/houshaolin/article/details/76408399

喵五郎
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部