Spring——Spring事务的实现方式及传播特性

2023-10-27

一、Spring事务的实现方式及原理

1.实现方式

在使用Spring框架的时候,有以下两种事务的实现方式:

  1. 编程式事务:用户自己通过代码来控制事务的处理逻辑
  2. 声明式事务:通过@Transactional注解来实现

​        事务的操作本来应该是由数据库来进行控制,但是为了方便用户进行业务逻辑的操作,spring对事务功能进行了扩展实现,一般很少会用编程式事务,更多的是通过添加@Transactional注解来进行实现,当添加此注解之后事务的自动功能就会关闭,有spring框架来帮助进行控制。

2.实现原理

        Spring的事务操作是AOP的一个核心体现,当一个方法添加@Transactional注解之后,spring会基于这个类生成一个代理对象,会将这个代理对象作为bean,当使用这个代理对象的方法的时候,如果有事务处理,那么会先把事务的自动提交给关系,然后去执行具体的业务逻辑,如果执行逻辑没有出现异常,那么代理逻辑就会直接提交,如果出现任何异常情况,那么直接进行回滚操作,当然用户可以控制对哪些异常进行回滚操作。

二、Spring事务的传播特性

        当使用@Transactional注解实现事务时,且多个事务方法相互调用时,事务如何在这些方法之间进行传播。spring中提供了7中不同的传播特性,来保证事务的正常执行。具体使用方式如下:

@Transactional(propagation = Propagation.REQUIRED)
public int saveUser(User user){
    scoreDao.save(**);
    return userDao.save(user);
}

Spring事务的7中传播特性: 

  • ​ REQUIRED:默认的传播特性,如果当前没有事务,则新建一个事务,如果当前存在事务,则加入这个事务

方法A中调用方法B,B方法的事务传播设置为PROPAGATION_REQUIRED,则如果A方法上有事务,B就用A的事务,没有的话,B就自己新建一个事务。

  • ​ SUPPORTS:当前存在事务,则加入当前事务,如果当前没有事务,则以非事务的方式执行

方法A中调用方法B,B方法的事务传播设置为PROPAGATION_SUPPORTS,则如果A方法上有事务,B就用A的事务,没有的话,B就以非事务方式执行。

  • ​ MANDATORY:当前存在事务,则加入当前事务,如果当前事务不存在,则抛出异常

方法A中调用方法B,B方法的事务传播设置为PROPAGATION_MANDATORY,则要求A方法上有事务,有的话,B用A的事务。A没有的话,就报错。

  • ​ REQUIRED_NEW:创建一个新事务,如果存在当前事务,则挂起该事务

方法A中调用方法B,B方法的事务传播设置为PROPAGATION_REQUIRES_NEW,则如果A方法上有事务,则将A方法的事务挂起,B用自己的事务。A方法没有事务的话,B自己就新建一个事务。

  • ​ NOT_SUPPORTED:以非事务方式执行,如果存在当前事务,则挂起当前事务

方法A中调用方法B,B方法的事务传播设置为PROPAGATION_NOT_SUPPORTED,则如果A方法上有事务,则将A方法的事务挂起(因为A、B方法是在同一个线程中执行的)以非事务方式执行,以非事务方式执行。A没有事务,就以非事务方式执行。

  • ​ NEVER:不使用事务,如果当前事务存在,则抛出异常

方法A中调用方法B,B方法的事务传播设置为PROPAGATION_NEVER,则要求A方法上不能有事务,有的话,就报错。A没有事务,就以非事务方式执行,B始终是以非事务方式执行。

  • ​ NESTED:如果当前事务存在,则在嵌套事务中执行,否则REQUIRED的操作一样

方法A中调用方法B,B方法的事务传播设置为PROPAGATION_NESTED,则如果A方法上有事务,则B方法的事务嵌套在A方法事务中。A方法没有事务的话,B自己就新建一个事务。

 NESTED与REQUIRED和REQUIRED_NEW的区别如下:

​ NESTED和REQUIRED_NEW的区别:

​ REQUIRED_NEW是新建一个事务并且新开始的这个事务与原有事务无关,而NESTED则是当前存在事务时会开启一个嵌套事务,在NESTED情况下,父事务回滚时,子事务也会回滚,而REQUIRED_NEW情况下,原有事务回滚,不会影响新开启的事务

​ NESTED和REQUIRED的区别:

​ REQUIRED情况下,调用方存在事务时,则被调用方和调用方使用同一个事务,那么被调用方出现异常时,由于共用一个事务,所以无论是否catch异常,事务都会回滚,而在NESTED情况下,被调用方发生异常时,调用方可以catch其异常,这样只有子事务回滚,父事务不会回滚。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring——Spring事务的实现方式及传播特性 的相关文章

随机推荐

  • pythonturtle填充颜色函数_python turtle库颜色填充-绘制心形

    颜色填充函数 使用Turtle不仅可以画线条 也可以将画出的封闭线条进行填充 开始填充 begin fill 设定填充色 fillecolor 结束填充 end fill 实际操作 练习1 画心形import turtle import r
  • matlab中列平方求和公式,matlab求两列数据的平方和

    matlab怎样求矩阵每一行的平方和 有矩阵a则你所要求的矩阵b sum a a 2 附 这是点乘 就是矩阵每个对应位置的元素相乘sum a 2 是按行相加 得出的为列向量若sum a 是按列相加 得出的为行向量 基于matlab的数据正态
  • C语言的强制类型转换本质是什么?

    数据在计算机中是如何存储的 程序最终是要在计算机中运行的 中间产生的数据会暂存在内存 寄存器 cache中 也可以写到硬盘中保存起来 对计算机而言 数据没有什么变量类型 int char等 的区别 以字节为单位 计算机里存在的不是0就是1
  • AES128/ECB/PKCS5Padding 的实现

    AES的相关基础知识直接看WikiPedia 高级加密标准 附上 C C 可用代码 AES Cipher
  • 第15届全国大学生知识竞赛 2022ciscn初赛 部分wp

    Misc ez usb 1 键盘流量 USB协议数据部分在Leftover Capture Data域中 数据长度为八个字节 其中键盘击键信息集中在第三个字节中 如图 发现击键信息为0x06 即对应的按键为C 2 鼠标流量 USB协议鼠标数
  • Quoit Design (白话--分治--平面点对问题)

    Quoit Design Problem Description Have you ever played quoit in a playground Quoit is a game in which flat rings are pitc
  • php 获取图片的宽高,js如何获取图片宽高

    js获取图片宽高的方法 1 onload后在打印 2 通过complete与onload一起混合使用 3 通过定时循环检测获取 代码为 from check width img width height img heig 本教程操作环境 w
  • 二十天入门Java系列:第一天

    文章目录 第一天 01 01 计算机基础知识 计算机概述 了解 01 02 计算机基础知识 软件开发和计算机语言概述 了解 01 03 计算机基础知识 人机交互 了解 01 04 计算机基础知识 键盘功能键和快捷键 掌握 01 05 计算机
  • FPGA查找表

    一 查找表 Look Up Table 的原理与结构 采用这种结构的PLD芯片我们也可以称之为FPGA 如altera的ACEX APEX系列 xilinx的Spartan Virtex系列等 查找表 Look Up Table 简称为LU
  • 任意整数从0-x累加的巧妙算法

    巧妙的累加算法 include
  • 【实验七】【使用规则实现数据完整性】

    文章目录 数据完整性 约束的形式 规则与默认值的SQL语句 一 创建一个关于开课学期的规则 二 创建一个关于性别的规则 三 创建一个关于学分的规则 总结 Reference 数据完整性 约束的形式 下边通过一个总体说明约束怎样保证数据完整性
  • 利用CDN加速react webpack打包后的文件

    此文不介绍webpack基本配置 如果对基本配置有疑问请查阅官方文档 1 配置webpack config js 将output publicPath改成上传到的cdn地址 例 对应上面上传配置 publicPath https your
  • vue 数据代理和数据监测

    vue 数据代理和数据监测 数据代理和数据监测是vue 里面一个很重要的概念 但是他们在vue中扮演什么角色 了解这些前得先了解 数据代理和数据监测的概念 vue中双向绑定 v model和v bind 指令都能将模型数据反应到页面 而且每
  • Leetcode56.合并区间——善用排序与数据结构

    文章目录 引入 题解 引入 该题是这样的 56 合并区间 给出一个区间的集合 请合并所有重叠的区间 示例 1 输入 1 3 2 6 8 10 15 18 输出 1 6 8 10 15 18 解释 区间 1 3 和 2 6 重叠 将它们合并为
  • R语言ggpubr包优雅绘制带统计数据的箱线图

    ggpubr包是个很经典的R包 能绘制专业的论文绘图 它是对ggplot2进行了加强 R包的说明也是介绍用于创建和自定义基于 ggplot2 的出版物绘图 就是个为SCI而生的R包呀 今天咱们使用ggpubr绘制专业的论文需要的带统计数据的
  • 一学就会——电脑安装CentOS 8虚拟机

    该课程是 Linux应用开发学习路线图 的基础课程 简介 很多同学在学习CentOS 的时候 苦于没有CentOS 环境 从0搭建一个CentOS 环境 对应小白来说 确实是一个挑战 本教程从0讲解如何安装一台CentOS 咱们只需要一台电
  • 从 0 到 1 落地前端工程化

    你将获得 初识 总结前端工程化技能图谱 了解 梳理前端工程化落地流程 掌握 搭建前端工程化基建项目 提高 实战前端工程化解决方案 作者介绍 JowayYoung 资深前端工程师 目前就职于网易互动娱乐事业群 负责前端工程化与前端架构设计相关
  • vue 从A页面跳到B页面添加数据,从B页面返回上一页(A页面)时实时刷新A页面的数据

    A页面 在activated中写需要刷新的数据的接口 data return page 1 pageSize 10 total 0 tableData methods 查询数据的方法 getAuthList this ajax get ad
  • 回型矩阵C++代码

    题目描述 给你一个整数n 按要求输出n n的回型矩阵 输入描述 输入一行 包含一个整数n 1 lt n lt 19 输出描述 输出n行 每行包含n个正整数 示例1 输入 4 输出 1 2 3 4 12 13 14 5 11 16 15 6
  • Spring——Spring事务的实现方式及传播特性

    Spring事务的特性及隔离级别同事务 详情请见事务 什么是事务 事务的特性 事务的隔离级别 醉酒的戈多的博客 CSDN博客 一 Spring事务的实现方式及原理 1 实现方式 在使用Spring框架的时候 有以下两种事务的实现方式 编程式