【Spring】Spring的7种事务传播机制讲解,以及49种组合方式介绍

您所在的位置:网站首页 课程开发的机制有哪些 【Spring】Spring的7种事务传播机制讲解,以及49种组合方式介绍

【Spring】Spring的7种事务传播机制讲解,以及49种组合方式介绍

2024-07-16 16:51:59| 来源: 网络整理| 查看: 265

文章目录

目录

文章目录正文        一、Spring的7种事务传播机制        二、事务传播的49种组合方式

正文         一、Spring的7种事务传播机制

        Spring事务传播机制是指在多个事务方法相互调用的情况下,事务如何在方法之间进行传播和管理的机制。通过事务传播机制,可以控制事务的范围和行为,保证多个事务方法的一致性和完整性。Spring提供了七种事务传播行为,分别是:REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED。其中REQUIRED为Spring默认的传播机制。

        1. REQUIRED:如果当前存在事务,则加入该事务,如果不存在事务,则创建一个事务。

         解释:当方法a声明了该事务,方法b也声明该事务时,如果方法a调用了方法b,那么b不会再创建自己事务而是加入方法a,他们共享同一个事务上下文,b回滚a也回滚、a回滚b也回滚。而当方法a未声明事务,方法b声明了该事务时,a调用b,会为方法b创建事务,而a不会。

@Transactional(propagation = Propagation.REQUIRED) //默认@Transactional即可

         REQUIRED常用于有修改操作的操作。

        2. SUPPORTS:如果当前存在事务,则加入该事务,如果不存在事务,则以非事务的方式执行。

        解释:当方法a声明了一个事务,方法b声明了该事务时,同理,他们共享事务上下文。而当方法a未声明事务,方法b声明该事务,a调用b,a、b都没有事务,出现异常时a、b都不回滚。当然如果有一个方法c声明了该事务,我们直接调用该方法,出现异常也不会回滚,因为主方法是未声明事务的因此c也以非事务的方式执行。

@Transactional(propagation = Propagation.SUPPORTS)

         SUPPORTS常用于只有查询相关的操作:当只需要查询时不开启事务,而当需要根据这些查询结果再进行修改操作时,加入到修改操作方法的事务中去,从而保证原子性。

        3. MANDATORY:如果当前存在事务,则加入到当前事务中;如果当前没有事务,则抛出异常。

        解释:当方法a声明了一个事务,方法b声明了该事务时,同理,他们共享事务上下文。而当方法a未声明事务,方法b声明该事务,a调用b,抛出异常。同理如果有一个方法c声明了该事务,我们直接调用该方法,由于主方法未声明事务因此会直接抛出异常。

@Transactional(propagation = Propagation.MANDATORY)

        4. REQUIRES_NEW:总是创建一个新的事务,如果当前存在事务,则挂起当前事务。

        解释:不论方法a是否声明事务,方法b声明了该事务时,a调用b,都会为b创建一个自己的事务。而当a没有事务时,b独立事务运行;当a有事务时,挂起a的事务,等待b的事务执行完毕后再恢复执行a。

@Transactional(propagation = Propagation.REQUIRES_NEW)

        5. NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则挂起当前事务。

        解释:如果方法a存在事务,会挂起a的事务,等待b执行完毕后再恢复执行a。

@Transactional(propagation = Propagation.NOT_SUPPORTED)

        6. NEVER:以非事务方式执行操作,如果当前存在事务,则抛出异常。

        解释:当方法a声明了一个事务,方法b声明了该事务时,a调用b,b方法会抛出异常。

@Transactional(propagation = Propagation.NEVER)

        7. NESTED:如果当前存在事务,则在当前事务中创建一个新的嵌套事务;如果当前没有事务,则创建一个新的事务。

         解释:如果数据库支持嵌套事务,那么就会存在多个begin和commit,a调用b,方法b运行完就提交了,与a互不影响。如果数据库不支持嵌套事务比如常用的MySQL,那么使用savepoint设置保存点,如果代码出现问题需要回滚,就使用rollback返回到保持点,最后在代码执行完后commit。

@Transactional(propagation = Propagation.NESTED)         二、事务传播的49种组合方式

        这里都以方法a和方法b举例,a调用b。

1. 方法a事务传播方式为REQUIRED时

REQUIRED - REQUIRED:如果a方法在事务中运行,则b方法将继承a方法的事务。如果a方法没有事务,则b方法将在一个新的事务中运行。 REQUIRED - SUPPORTS:如果a方法在事务中运行,则b方法将继承a方法的事务。如果a方法没有事务,则b方法将以非事务方式运行。 REQUIRED - MANDATORY:如果a方法在事务中运行,则b方法将继承a方法的事务。如果a方法没有事务,则b方法将抛出异常。 REQUIRED - REQUIRES_NEW:无论a方法是否在事务中运行,b方法都会开启一个新的事务并在该事务中运行。 REQUIRED - NOT_SUPPORTED:如果a方法在事务中运行,则b方法将以非事务方式运行。如果a方法没有事务,则b方法也将以非事务方式运行。 REQUIRED - NEVER:如果a方法在事务中运行,则b方法将抛出异常。如果a方法没有事务,则b方法将以非事务方式运行。 REQUIRED - NESTED:如果a方法在事务中运行,则b方法将作为a方法的嵌套事务运行。如果a方法没有事务,则b方法将在一个新的事务中运行。

2. 方法a事务传播方式为SUPPORTS时

SUPPORTS - REQUIRED:如果a方法在事务中运行,则b方法将继承a方法的事务。如果a方法没有事务,则b方法将在一个新的事务中运行。 SUPPORTS - SUPPORTS:无论a方法是否在事务中运行,b方法都不会开启新的事务,而是以非事务方式运行。 SUPPORTS - MANDATORY:如果a方法在事务中运行,则b方法将继承a方法的事务。如果a方法没有事务,则b方法将抛出异常。 SUPPORTS - REQUIRES_NEW:无论a方法是否在事务中运行,b方法都会开启一个新的事务并在该事务中运行。 SUPPORTS - NOT_SUPPORTED:无论a方法是否在事务中运行,b方法都将以非事务方式运行。 SUPPORTS - NEVER:如果a方法在事务中运行,则b方法将抛出异常。如果a方法没有事务,则b方法将以非事务方式运行。 SUPPORTS - NESTED:如果a方法在事务中运行,则b方法将作为a方法的嵌套事务运行。如果a方法没有事务,则b方法将以非事务方式运行。

 3. 方法a事务传播方式为MANDATORY时

MANDATORY - REQUIRED:如果a方法在事务中运行,则b方法将继承a方法的事务。如果a方法没有事务,则b方法将抛出异常。 MANDATORY - SUPPORTS:如果a方法在事务中运行,则b方法将继承a方法的事务。如果a方法没有事务,则b方法将以非事务方式运行。 MANDATORY - MANDATORY:如果a方法在事务中运行,则b方法将继承a方法的事务。如果a方法没有事务,则b方法将抛出异常。 MANDATORY - REQUIRES_NEW:无论a方法是否在事务中运行,b方法都会开启一个新的事务并在该事务中运行。 MANDATORY - NOT_SUPPORTED:如果a方法在事务中运行,则b方法将以非事务方式运行。如果a方法没有事务,则b方法也将以非事务方式运行。 MANDATORY - NEVER:如果a方法在事务中运行,则b方法将抛出异常。如果a方法没有事务,则b方法将以非事务方式运行。 MANDATORY - NESTED:如果a方法在事务中运行,则b方法将作为a方法的嵌套事务运行。如果a方法没有事务,则b方法将抛出异常。

4. 方法a事务传播方式为REQUIRES_NEW时

REQUIRES_NEW - REQUIRED:无论a方法是否在事务中运行,b方法都会开启一个新的事务并在该事务中运行。 REQUIRES_NEW - SUPPORTS:无论a方法是否在事务中运行,b方法都会开启一个新的事务并在该事务中运行。 REQUIRES_NEW - MANDATORY:无论a方法是否在事务中运行,b方法都会开启一个新的事务并在该事务中运行。 REQUIRES_NEW - REQUIRES_NEW:无论a方法是否在事务中运行,b方法都会开启一个新的事务并在该事务中运行。 REQUIRES_NEW - NOT_SUPPORTED:无论a方法是否在事务中运行,b方法都将以非事务方式运行。 REQUIRES_NEW - NEVER:无论a方法是否在事务中运行,b方法都会以非事务方式运行。 REQUIRES_NEW - NESTED:无论a方法是否在事务中运行,b方法都会开启一个新的事务并在该事务中运行。

5. 方法a事务传播方式为NOT_SUPPORTED时

NOT_SUPPORTED - REQUIRED:如果a方法在事务中运行,则b方法将以非事务方式运行。如果a方法没有事务,则b方法将在一个新的事务中运行。 NOT_SUPPORTED - SUPPORTS:无论a方法是否在事务中运行,b方法都将以非事务方式运行。 NOT_SUPPORTED - MANDATORY:如果a方法在事务中运行,则b方法将以非事务方式运行。如果a方法没有事务,则b方法将抛出异常。 NOT_SUPPORTED - REQUIRES_NEW:无论a方法是否在事务中运行,b方法都会开启一个新的事务并在该事务中运行。 NOT_SUPPORTED - NOT_SUPPORTED:无论a方法是否在事务中运行,b方法都将以非事务方式运行。 NOT_SUPPORTED - NEVER:如果a方法在事务中运行,则b方法将抛出异常。如果a方法没有事务,则b方法将以非事务方式运行。 NOT_SUPPORTED - NESTED:如果a方法在事务中运行,则b方法将以非事务方式运行。如果a方法没有事务,则b方法将在一个新的事务中运行。

6. 方法a事务传播方式为NEVER时

NEVER - REQUIRED:如果a方法在事务中运行,则b方法将抛出异常。如果a方法没有事务,则b方法将在一个新的事务中运行。 NEVER - SUPPORTS:如果a方法在事务中运行,则b方法将抛出异常。如果a方法没有事务,则b方法将以非事务方式运行。 NEVER - MANDATORY:如果a方法在事务中运行,则b方法将抛出异常。如果a方法没有事务,则b方法将抛出异常。 NEVER - REQUIRES_NEW:无论a方法是否在事务中运行,b方法都会开启一个新的事务并在该事务中运行。 NEVER - NOT_SUPPORTED:无论a方法是否在事务中运行,b方法都将以非事务方式运行。 NEVER - NEVER:如果a方法在事务中运行,则b方法将抛出异常。如果a方法没有事务,则b方法将以非事务方式运行。 NEVER - NESTED:如果a方法在事务中运行,则b方法将抛出异常。如果a方法没有事务,则b方法将以非事务方式运行。

7. 方法a事务传播方式为NESTED时

NESTED - REQUIRED:如果a方法在事务中运行,则b方法将作为a方法的嵌套事务运行。如果a方法没有事务,则b方法将在一个新的事务中运行。 NESTED - SUPPORTS:如果a方法在事务中运行,则b方法将作为a方法的嵌套事务运行。如果a方法没有事务,则b方法将以非事务方式运行。 NESTED - MANDATORY:如果a方法在事务中运行,则b方法将作为a方法的嵌套事务运行。如果a方法没有事务,则b方法将抛出异常。 NESTED - REQUIRES_NEW:无论a方法是否在事务中运行,b方法都会开启一个新的事务并在该事务中运行。 NESTED - NOT_SUPPORTED:如果a方法在事务中运行,则b方法将以非事务方式运行。如果a方法没有事务,则b方法将以非事务方式运行。 NESTED - NEVER:如果a方法在事务中运行,则b方法将抛出异常。如果a方法没有事务,则b方法将以非事务方式运行。 NESTED - NESTED:如果a方法在事务中运行,则b方法将作为a方法的嵌套事务运行。如果a方法没有事务,则b方法将在一个新的事务中运行。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭