事务的传播机制

事务的传播机制有7种,下面的传播机制都是针对于被调用的方法来说的,理解起来需要想象成两个service,本文的案例主要讲的是传播机制中的PROPAGATION_REQUIRES_NEW和PROPAGATION_NESTED。

(1)PROPAGATION_REQUIRED(默认):支持使用当前事务,如果当前事务不存在,创建一个新事务。

(2)PROPAGATION_SUPPORTS:支持使用当前事务,如果当前事务不存在,则不使用事务。

(3)PROPAGATION_MANDATORY:中文翻译为强制,支持使用当前事务,如果当前事务不存在,则抛出Exception。

(4)PROPAGATION_REQUIRES_NEW(常用):创建一个新事务,如果当前事务存在,把当前事务挂起。

这个方法会独立提交事务,不受调用者的事务影响,父级异常,它也是正常提交。

(5)PROPAGATION_NOT_SUPPORTED:无事务执行,如果当前事务存在,把当前事务挂起。

(6)PROPAGATION_NEVER:无事务执行,如果当前有事务则抛出Exception。

(7)PROPAGATION_NESTED(常用):嵌套事务,如果当前事务存在,那么在嵌套的事务中执行。如果当前事务不存在,则表现跟REQUIRED一样。

如果当前存在事务,它将会成为父级事务的一个子事务,方法结束后并没有提交,只有等父事务结束才提交。

如果当前没有事务,则新建事务。

如果它异常,父级可以捕获它的异常而不进行回滚,正常提交。

但如果父级异常,它必然回滚,这就是和 REQUIRES_NEW 的区别。

下面直接上案例:

A、B都开启了事务,并且事务A里面方法调用了事务B里的方法

 在这里让B发生异常,那么最后经过测试A、B都会发生异常,并且回滚(如果A里面对B进行了try-catch,那么还是会都会回滚)

那么怎样实现B发生异常后,回滚了。A不回滚,数据insert成功?(bz在业务需求中遇到过这样的)

解决方法:(1)事务B里面修改传播机制(默认的机制是PROPAGATION_REQUIRED),经过测试以下两种机制都是可以的。

Propagation_requires_new和propagation_nested的区别(重要,比较常用):

前者如果父级发生了异常,则子事务也是正常提交;后者是如何父级发生了异常,则子事务必然发生回滚。

具体使用哪种传播机制,当然还得根据实际的业务场景来决定。

原文地址:https://www.cnblogs.com/wei-cy/p/12241612.html

时间: 2024-10-17 03:25:09

事务的传播机制的相关文章

spring事务的传播机制和隔离性

1.事务的传播机制: 指多个事务方法在相互调用时,事务如何在这些方法中传播. Spring支持7种事务传播行为: PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中.这是最常见的选择. PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行. PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常. PROPAGATION_REQUIRES_NEW 新建事务,

数据库的特性与隔离级别和spring事务的传播机制和隔离级别

首先数据库的特性就是 ACID: Atomicity 原子性:所有事务是一个整体,要么全部成功,要么失败 Consistency 一致性:在事务开始和结束前,要保持一致性状态 Isolation 隔离性: 对于同一个表的操作,每个事务都是单独的,不会影响其他事务. Durability 持久性: 事务一旦提交,数据库中的数据就是永久的了. 对于以上四种特性中的隔离性,不同的策略会有不同的弊端:脏读,不可重复读,幻读. 脏读: 就是一个事务读取了别的事务执行过程中未提交的数据. 不可重复读: 就是

Spring事务之传播机制

Spring事务传播机制:Spring在TransactionDefinition接口中规定了种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套时事务如何进行传播.即协调已经有事务标识的方法之间的发生调用时的事务上下文的规则(是否要有独立的事务隔离级别和锁). 事务的嵌套概念:所谓事务的嵌套就是两个事务方法之间相互调用.Spring事务开启,或者是基于接口的,或者是基于类的代理被创建(注意一定要是代理,不能手动new一个对象,并且此类(有无接口都行)一定要被代理----Spring中的b

深入理解事务--Spring事务的传播机制

https://blog.csdn.net/yuanlaishini2010/article/details/45792069 事务的嵌套概念 所谓事务的嵌套就是两个事务方法之间相互调用.spring事务开启 ,或者是基于接口的或者是基于类的代理被创建(注意一定要是代理,不能手动new 一个对象,并且此类(有无接口都行)一定要被代理--spring中的bean只要纳入了IOC管理都是被代理的).所以在同一个类中一个方法调用另一个方法有事务的方法,事务是不会起作用的. ### Spring默认情况

spring事务传播机制和隔离级别

7种事务的传播机制(可通过spring配置或注解来设置) REQUIRED(默认):支持使用当前事务,如果当前事务不存在,创建一个新事务. SUPPORTS:支持使用当前事务,如果当前事务不存在,则不使用事务. MANDATORY:中文翻译为强制,支持使用当前事务,如果当前事务不存在,则抛出Exception. REQUIRES_NEW:创建一个新事务,如果当前事务存在,把当前事务挂起. NOT_SUPPORTED:无事务执行,如果当前事务存在,把当前事务挂起. NEVER:无事务执行,如果当前

实例详解Spring的事务传播机制(二)

上面我们讨论了NEVER和MANDATORY的作用,下面我们接着讨论其他情况. 3. SUPPORTS 如果有事务则加入该事务,如果没有存在的事务则以非事务的方式运行. 我们先让insertSubTable方法在无事务的情况下运行.配置文件为: <tx:attributes>       <!--     <tx:method name="insertSuperTable" propagation="REQUIRED"/>      -

实例详解Spring的事务传播机制(一)

Spring有7种事务传播机制,本文主要用实例说明各种传播机制的事务效果,和发生异常的回滚方式.7种事务传播机制网上的资料大多都是如下的描述: 事务传播行为类型 说明 PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中.这是最常见的选择. PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行. PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常. PRO

实例详解Spring的事务传播机制(三)

最后这篇文章我们来讨论开发中最常用的剩下三种事务传播机制:REQUIRED.REQUIRES_NEW和NESTED 5. REQUIRED REQUIRED是我们最常用的传播机制.如果当前有存在的事务则加入该事务,如果没有则新开一个事务. 先修改配置文件: <tx:attributes>       <tx:method name="insertSuperTable" propagation="REQUIRED"/>      <tx:

Spring 管理Hibernate事务之事务传播机制

public enum Propagation {    REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED),    SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS),    MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY),    NOT_SUPPORTED(TransactionDefinition.PROPAGATION_