Spring的事务传播行为

原创 2018年02月05日 09:03:19

Spring一共提供了7种事务传播行为:

1、PROPAGATION_REQURED;

2、PROPAGATION_REQURED_NEW;

3、PROPAGATION_NESTED;

4、PROPAGATION_SUPPORTS;

5、PROPAGATION_NOT_SUPPORTS;

6、PROPAGATION_NEVER;

7、PROPAGATION_MANDATORY;

假设事务从方法A传播到方法B,用户需要面对方法B,问自己一个问题:方法A有事务吗?

(1)如果没有,就新建一个事务;如果有,就加入当前事务。这就是PROPAGATION_REQURED,它也是Spring提供的默认事务传播行为,适合绝大多数场景。

(2)如果没有,就新建一个事务;如果有,就将当前事务挂起。这就是PROPAGATION_REQURED_NEW,意思就是创建了一个新事务,它和原来的事务没有任何关系了。

(3)如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务。这就是PROPAGATION_NESTED,也就是“嵌套事务”,所嵌套的子事务与主事务之间是有关联的(当主事务提交或回滚,子事务也会提交或回滚)。

(4)如果没有,就以非事务方式执行;如果有,就使用当前事务。这就是PROPAGATION_SUPPORTS,这种方式非常随意,没有就没有,有就有,有点无所谓的态度,反正是支持的。

(5)如果没有,就以非事务方式执行;如果有,就将当前事务挂起。这就是PROPAGATION_NOT_SUPPORTS,这种方式非常强硬,没有就没有,有也不支持,挂起来,不管它。

(6)如果没有,就以非事务方式执行;如果有,就抛出异常。这就是PROPAGATION_NEVER,这种方式更强硬,没有就没有,有了反而报错,它对大家宣称:我从不支持事务。

(7)如果没有,就抛出异常;如果有,就使用当前事务。这就是PROPAGATION_MANDATORY,这种方式可以说是最强硬的,没有事务就直接报错,它对世界说:我必须要有事务。

Spring的事务传播行为,确实是一个分厂强大而又使用的功能。除此之外,它还提供了一些小的附加功能,比如:

1、事务超市(Transaction Timeout)——为了解决事务时间太长,消耗太多资源的问题,所以故意给事务设置一个最大时长,如果超时了,就回滚事务。

2、只读事务(Readonly Transaction)——为了忽略哪些不需要事务的方法,比如读取数据,这样可以有效的提供啊一些性能。

在Spring配置文件中使用:

...
<tx:annotation-driven />
...
在需要事务的方法上使用:

@Transactional
public void xxx() {
   ...
}
可在 Transactional 注解中设置事务的隔离级别、事务传播行为、事务超时时间、是否只读事务。


在VC中实现程序在启动时隐藏

    最近经常见论坛上有人问,程序在启动时如何隐藏。以下是我总结的一些方法,欢迎大家讨论,找出更好的方法。    对于这类问题,大家最容易想到的可能就是在PreCreateWindow中添加cs.s...
  • AttaBoy
  • AttaBoy
  • 2002-03-03 09:18:00
  • 1205

浅析Spring 事务(二十一) spring事务的传播行为

经过我们上面一个章节的初步了解,我们已经知道了Spring事务的基本配置,今天我们一起接着讨论一下spring事务的传播...
  • linuu
  • linuu
  • 2016-03-29 16:07:34
  • 3859

【Spring学习34】Spring事务(4):事务属性之7种传播行为

事务传播行为什么叫事务传播行为?听起来挺高端的,其实很简单。 即然是传播,那么至少有两个东西,才可以发生传播。单体不存在传播这个行为。事务传播行为(propagation behavior)指的就是...
  • soonfly
  • soonfly
  • 2017-04-20 21:35:42
  • 1176

spring 事务传播行为实例分析

欢迎转载和指正,转载时请说明来源
  • pml18710973036
  • pml18710973036
  • 2017-02-28 17:29:38
  • 6627

Spring的7种事务传播行为类型

1、PROPAGATION_REQUIRED :如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。 2、PROPAGATION_SUPPORTS:支持当前事务,...
  • hsgao_water
  • hsgao_water
  • 2016-10-19 16:50:34
  • 8393

Spring中事务传播行为种类

Spring在TransactionDefinition接口中规定了7种类型的事务传播行为, 它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播: 事务传播行为类型 ...
  • huaishuming
  • huaishuming
  • 2015-09-16 12:28:43
  • 1292

浅析Spring事务传播行为和隔离级别

7个传播行为,4个隔离级别。 Spring事务的传播行为和隔离级别[transaction behavior and isolated level] Spring中事务的定义: Propagation...
  • it_wangxiangpan
  • it_wangxiangpan
  • 2014-04-20 13:23:41
  • 15696

Spring声明式事务@Transactional传播行为

在@Transactional注解中,可以propagation属性用来配置事务传播,支持7种不同的传播机制: REQUIRED:业务方法需要在一个事务中运行,如果方法运行时,已处在一个事务中,那么就...
  • totally123
  • totally123
  • 2016-08-24 16:20:06
  • 1962

使用Spring注解方式管理事务与传播行为详解

前面讲解了怎么使用@Transactional注解声明PersonServiceBean底下所有的业务方法需要事务管理,那么事务是如何来管理的呢? 我们知道当每个业务方法执行的时候,它都会打开事务,...
  • yerenyuan_pku
  • yerenyuan_pku
  • 2016-10-21 16:48:29
  • 6076

Spring事务的传播行为 @Transactional

Spring事务的传播行为   在service类前加上@Transactional,声明这个service所有方法需要事务管理。每一个业务方法开始时都会打开一个事务。 Spring默认情况下会...
  • seng3018
  • seng3018
  • 2011-08-16 09:21:45
  • 13938
收藏助手
不良信息举报
您举报文章:Spring的事务传播行为
举报原因:
原因补充:

(最多只允许输入30个字)