当前位置: 首页 > news >正文

Spring事务传播机制详细讲解

文章目录

  • 一、事务传播机制
    • 1. REQUIRED:
    • 2. SUPPORTS:
    • 3. MANDATORY:
    • 4. REQUIRES_NEW:
    • 5. NOT_SUPPORTED:
    • 6. NEVER:
    • 7. NESTED:
  • 二、事务传播机制分类
    • 1. 支持当前事务的传播机制:REQUIRED、SUPPORTS、MANDATORY
    • 2. 不支持当前事务的传播机制:REQUIRES_NEW、NOT_SUPPORTED、NEVER
    • 3. 嵌套事务的传播机制:NESTED

事务传播机制

一、事务传播机制

1. REQUIRED:

🎆如果当前存在事务,方法将在该事务中运行;否则,将创建一个新的事务。这是默认的传播行为。如果嵌套的方法出现异常,整个事务将回滚。🎆

当使用REQUIRED传播机制时,如果当前已存在事务,则方法将在该事务中运行;如果当前没有事务,则将创建一个新的事务。

下面是一个简单的示例示范如何使用REQUIRED传播机制:

@Service
public class TransactionService {@Autowiredprivate TransactionDao transactionDao;@Transactional(propagation = Propagation.REQUIRED)public void performTransaction(String fromAccount, String toAccount, double amount) {try {// 执行转账操作transactionDao.debit(fromAccount, amount);transactionDao.credit(toAccount, amount);} catch (Exception e) {// 处理异常情况e.printStackTrace();}}
}

在这个示例中,performTransaction方法使用REQUIRED传播机制。如果在调用该方法时已经存在一个事务,那么该方法将在该事务中运行。如果在调用该方法时没有事务,那么将创建一个新的事务。

假设在调用performTransaction方法之前已经存在一个事务,那么在方法内部的数据库操作将在该事务中进行。如果任何一个数据库操作失败,事务将回滚,所有的改变将被撤销。

如果在调用performTransaction方法之前没有事务,那么将创建一个新的事务。在方法内部的数据库操作将在这个新的事务中进行。如果任何一个数据库操作失败,事务将回滚,所有的改变将被撤销。

这样做的好处是,如果在一个业务方法中调用多个数据库操作,可以确保这些操作要么全部成功,要么全部失败。如果其中一个操作失败,可以回滚整个事务,保持数据的一致性。

2. SUPPORTS:

🎆有事物则加入事物,没有事物则普通执行🎆

当使用SUPPORTS传播机制时,如果当前已存在事务,则方法将在该事务中运行;如果当前没有事务,则方法将在非事务环境中运行。

下面是一个简单的示例示范如何使用SUPPORTS传播机制:

@Service
public class TransactionService {@Autowiredprivate TransactionDao transactionDao;@Transactional(propagation = Propagation.SUPPORTS)public void performTransaction(String fromAccount, String toAccount, double amount) {try {// 执行转账操作transactionDao.debit(fromAccount, amount);transactionDao.credit(toAccount, amount);} catch (Exception e) {// 处理异常情况e.printStackTrace();}}
}

在这个示例中,performTransaction方法使用SUPPORTS传播机制。如果在调用该方法时已经存在一个事务,那么该方法将在该事务中运行。如果在调用该方法时没有事务,那么将在非事务环境中运行。

假设在调用performTransaction方法之前已经存在一个事务,那么在方法内部的数据库操作将在该事务中进行。如果任何一个数据库操作失败,事务将回滚,所有的改变将被撤销。

如果在调用performTransaction方法之前没有事务,那么将在非事务环境中执行方法内部的数据库操作。即使其中一个数据库操作失败,也不会回滚,因为非事务环境下没有事务可回滚。

这样做的好处是,可以在需要的时候使用事务,而在不需要事务的情况下,方法可以在非事务环境中运行,提高性能。但是需要注意的是,在非事务环境中执行的数据库操作将无法回滚,可能会导致数据不一致的问题,因此需要谨慎使用SUPPORTS传播机制。

3. MANDATORY:

🎆方法必须在一个已存在的事务中运行,否则将抛出异常。它适用于需要强制事务支持的方法。🎆

当使用MANDATORY传播机制时,方法必须在一个已存在的事务中执行。如果当前没有事务,则会抛出异常。

下面是一个简单的示例示范如何使用MANDATORY传播机制:

@Service
public class TransactionService {@Autowiredprivate TransactionDao transactionDao;@Transactional(propagation = Propagation.MANDATORY)public void performTransaction(String fromAccount, String toAccount, double amount) {try {// 执行转账操作transactionDao.debit(fromAccount, amount);transactionDao.credit(toAccount, amount);} catch (Exception e) {// 处理异常情况e.printStackTrace();}}
}

在这个示例中,performTransaction方法使用MANDATORY传播机制。如果在调用该方法时已经存在一个事务,那么该方法将在该事务中运行。如果在调用该方法时没有事务,那么将会抛出异常。

假设在调用performTransaction方法之前已经存在一个事务,那么在方法内部的数据库操作将在该事务中进行。如果任何一个数据库操作失败,事务将回滚,所有的改变将被撤销。

如果在调用performTransaction方法之前没有事务,那么将会抛出异常,因为MANDATORY传播机制要求方法必须在一个已存在的事务中执行。这样可以确保在调用该方法时,事务的一致性和完整性得到保证。

使用MANDATORY传播机制的好处是,可以确保方法在一个事务中执行,避免了在没有事务的情况下执行可能引起数据不一致的操作。这种传播机制通常用于业务操作中,确保相关操作在同一个事务中执行,保证数据的完整性。

4. REQUIRES_NEW:

🎆每次执行时都会创建一个新的事务。🎆

当使用REQUIRES_NEW传播机制时,方法将会在一个新的事务中执行。如果当前存在一个事务,则会挂起该事务,并在方法执行完毕后恢复原有事务。

下面是一个简单的示例示范如何使用REQUIRES_NEW传播机制:

@Service
public class TransactionService {@Autowiredprivate TransactionDao transactionDao;@Transactional(propagation = Propagation.REQUIRES_NEW)public void performTransaction(String fromAccount, String toAccount, double amount) {try {// 执行转账操作transactionDao.debit(fromAccount, amount);transactionDao.credit(toAccount, amount);} catch (Exception e) {// 处理异常情况e.printStackTrace();}}
}

在这个示例中,performTransaction方法使用REQUIRES_NEW传播机制。无论当前是否存在一个事务,该方法都会在一个新的事务中执行。

假设在调用performTransaction方法之前已经存在一个事务,那么在方法内部的数据库操作将在一个新的事务中进行。如果任何一个数据库操作失败,新的事务将回滚,所有的改变将被撤销,但原有的事务不受影响。

如果在调用performTransaction方法之前没有事务,那么将会创建一个新的事务并在方法内部的数据库操作中使用。如果任何一个数据库操作失败,新的事务将回滚,所有的改变将被撤销。

使用REQUIRES_NEW传播机制的好处是,可以将方法的执行独立于当前的事务,确保方法在一个新的事务中执行。这种传播机制通常用于需要独立事务执行的情况,例如在进行一些敏感操作时,避免与现有事务发生冲突。同时,使用REQUIRES_NEW传播机制可以避免潜在的死锁问题,因为方法在一个新的事务中执行,不会与其他事务产生竞争。

5. NOT_SUPPORTED:

🎆方法将以非事务的方式运行,如果当前存在事务,则将其挂起。适用于不需要事务支持的方法。🎆
当使用NOT_SUPPORTED传播机制时,方法将会在非事务的上下文中执行。如果当前存在一个事务,则会将事务挂起,并在方法执行完毕后恢复原有事务。

下面是一个简单的示例示范如何使用NOT_SUPPORTED传播机制:

@Service
public class TransactionService {@Autowiredprivate TransactionDao transactionDao;@Transactional(propagation = Propagation.NOT_SUPPORTED)public void performTransaction(String fromAccount, String toAccount, double amount) {try {// 执行转账操作transactionDao.debit(fromAccount, amount);transactionDao.credit(toAccount, amount);} catch (Exception e) {// 处理异常情况e.printStackTrace();}}
}

在这个示例中,performTransaction方法使用NOT_SUPPORTED传播机制。无论当前是否存在一个事务,该方法都会在非事务的上下文中执行。

假设在调用performTransaction方法之前已经存在一个事务,那么在方法内部的数据库操作将在非事务的上下文中进行。如果任何一个数据库操作失败,将不会回滚,所有的改变将被提交。

如果在调用performTransaction方法之前没有事务,那么方法将在非事务的上下文中执行,同样,如果任何一个数据库操作失败,将不会回滚,所有的改变将被提交。

使用NOT_SUPPORTED传播机制的好处是,方法将在非事务的上下文中执行,不受当前事务的影响。这种传播机制通常用于不需要事务支持的操作,例如查询操作或不涉及数据更新的方法。同时,使用NOT_SUPPORTED传播机制可以避免潜在的事务相关问题,例如死锁或锁竞争。然而,需要注意的是,使用NOT_SUPPORTED传播机制会导致方法无法回滚,因此在处理异常情况时需要特别小心。

6. NEVER:

🎆有事物则报异常,它适用于不允许事务支持的方法。🎆

当使用NEVER传播机制时,方法将会在非事务的上下文中执行。如果当前存在一个事务,则会抛出一个异常,阻止方法执行。

下面是一个简单的示例示范如何使用NEVER传播机制:

@Service
public class TransactionService {@Autowiredprivate TransactionDao transactionDao;@Transactional(propagation = Propagation.NEVER)public void performTransaction(String fromAccount, String toAccount, double amount) {try {// 执行转账操作transactionDao.debit(fromAccount, amount);transactionDao.credit(toAccount, amount);} catch (Exception e) {// 处理异常情况e.printStackTrace();}}
}

在这个示例中,performTransaction方法使用NEVER传播机制。如果在调用该方法之前已经存在一个事务,那么方法将会抛出一个异常,阻止方法的执行。

使用NEVER传播机制的好处是,可以确保方法在非事务的上下文中执行,避免了方法对事务的依赖。这种传播机制通常用于强制要求方法不在事务中执行的情况,例如某个方法需要独立于当前事务执行,或者需要确保方法不会影响当前事务的状态。

需要注意的是,使用NEVER传播机制会抛出异常,因此在方法调用时需要处理该异常。同时,使用NEVER传播机制也意味着方法无法回滚,因此在处理异常情况时需要特别小心。

7. NESTED:

🎆如果之前存在一个事务,则创建一个嵌套事务。嵌套事务的回滚不会影响到父事务,但是父事务的回滚会影响到嵌套事务。🎆

当使用NESTED传播机制时,方法将在一个新的嵌套事务中执行。如果当前不存在事务,则会创建一个新的事务。如果当前存在事务,则会在当前事务的上下文中创建一个嵌套事务。

下面是一个简单的示例示范如何使用NESTED传播机制:

@Service
public class TransactionService {@Autowiredprivate TransactionDao transactionDao;@Transactional(propagation = Propagation.NESTED)public void performTransaction(String fromAccount, String toAccount, double amount) {try {// 执行转账操作transactionDao.debit(fromAccount, amount);transactionDao.credit(toAccount, amount);} catch (Exception e) {// 处理异常情况e.printStackTrace();}}
}

在这个示例中,performTransaction方法使用NESTED传播机制。如果在调用该方法之前已经存在一个事务,那么方法将在当前事务的上下文中创建一个嵌套事务。如果在调用该方法之前不存在事务,则会创建一个新的事务。

NESTED传播机制的特点是,嵌套事务是作为当前事务的一部分进行管理的。当嵌套事务提交时,它会将自己的修改合并到父事务中;当嵌套事务回滚时,它会回滚自己的修改,而不会影响父事务的状态。如果父事务提交,嵌套事务的提交也会被提交;如果父事务回滚,嵌套事务的回滚也会被回滚。

需要注意的是,NESTED传播机制仅在特定的事务管理器中受支持,例如Spring的JtaTransactionManager。另外,嵌套事务的支持也取决于数据库的支持情况。

在使用NESTED传播机制时,需要考虑事务的管理和回滚策略。由于嵌套事务是作为当前事务的一部分进行管理的,因此在处理异常情况时需要特别小心,以确保事务的正确回滚。

🎈总结🎈
事务传播机制允许开发者根据实际需求来控制事务的行为。通过合理选择事务传播机制,可以保证事务的一致性和可靠性,提高系统的稳定性和性能。

需要注意的是,事务传播机制只对方法级别的事务起作用,对注解方式的事务不适用。在使用注解方式时,可以通过@Transactional注解的propagation属性来指定事务的传播行为。

二、事务传播机制分类

1. 支持当前事务的传播机制:REQUIRED、SUPPORTS、MANDATORY

  • REQUIRED:如果当前存在事务,方法将在该事务中运行;否则,将创建一个新的事务。
  • SUPPORTS:如果当前存在事务,方法将在该事务中运行;否则,以非事务的方式执行。
  • MANDATORY:方法必须在一个已存在的事务中运行,否则将抛出异常。

2. 不支持当前事务的传播机制:REQUIRES_NEW、NOT_SUPPORTED、NEVER

  • REQUIRES_NEW:方法将创建一个新的事务,并在自己的事务中运行,如果当前存在事务,则将其挂起。
  • NOT_SUPPORTED:方法将以非事务的方式运行,如果当前存在事务,则将其挂起。
  • NEVER:方法不能在一个已存在的事务中运行,否则将抛出异常。

3. 嵌套事务的传播机制:NESTED

  • NESTED:如果当前存在事务,则在嵌套事务中执行;如果没有事务,则行为类似于REQUIRED。嵌套事务是外部事务的一部分,可以独立地进行提交或回滚。
    这些传播机制可以根据业务需求来选择,确保事务的隔离性和一致性。

相关文章:

Spring事务传播机制详细讲解

文章目录 一、事务传播机制1. REQUIRED:2. SUPPORTS:3. MANDATORY:4. REQUIRES_NEW:5. NOT_SUPPORTED:6. NEVER:7. NESTED: 二、事务传播机制分类1. 支持当前事务的传播机制:REQUIRE…...

kubernetes 集群搭建(kubeadm 方式)

目前生产部署 Kubernetes 集群主要有两种方式: (1) kubeadm Kubeadm 是一个 Kubernetes 官方提供的命令行工具,可以用来部署和管理 Kubernetes 集群。它主要用于在新的 Kubernetes 环境中初始化集群、添加或删除节点等操作。 K…...

基于ARM+FPGA的驱控一体机器人控制器设计

目前市场上工业机器人,数控机床等多轴运动控制系统普遍采用运动控制器加 伺服驱动器的分布式控制方式。在这种控制方式中,控制器一方面完成人机交互,另 一方面进行 NC 代码的解释执行,插补运算,继而将计算出来的位…...

docker 安装 字体文件

先说一下我当前的 场景 及 环境,这样同学们可以先评估本篇文章是否有帮助。 环境: dockerphp8.1-fpmwindows 场景: 来了个需求,有一个默认背景图,可以理解为背景图是一个 "相框",相框里面就会放…...

Vue.js与ASP.NET的结合,实现企业级应用的开发和部署

在当今快速发展的互联网技术领域,企业级应用的开发和部署变得越来越重要。Vue.js和ASP.NET是两个在前端和后端开发中广泛使用的技术,将它们结合起来可以为企业级应用的开发和部署带来诸多优势。本文将通过代码示例介绍如何使用Vue.js和ASP.NET进行企业级…...

Uncaught SyntaxError: ‘‘ string literal contains an unescaped line break

今天在修改前端页面的时候,页面报错了,提示了这个信息 Uncaught SyntaxError: string literal contains an unescaped line break 问题指向这行代码,这就是通过JS渲染一个easyui的搜索框,仔细确认之后,发现没有任何问…...

Vue3+Vite+TypeScript常用项目模块详解

目录 1.Vue3ViteTypeScript 概述 1.1 vue3 1.1.1 Vue3 概述 1.1.2 vue3的现状与发展趋势 1.2 Vite 1.2.1 现实问题 1.2 搭建vite项目 1.3 TypeScript 1.3.1 TypeScript 定义 1.3.2 TypeScript 基本数据类型 1.3.3 TypeScript语法简单介绍 2. 项目配置简单概述 2.…...

数字电路(一)

1、例题 1、进行DA数模转换器选型时,一般要选择主要参数有( A)、转换精度和转换速度。 A、分辨率 B、输出电流 C、输出电阻 D、模拟开关 2、下图所示电路的逻辑功能为( B) A、与门 B、或门 C、与非门 D、或非门 分析该…...

Oracle也有回收站

在数据库管理中,数据的删除是一个常见的操作。然而,有时候我们可能会意外地删除了一些重要的数据。幸运的是,Oracle数据库提供了一个类似于回收站的功能,可以帮助我们恢复被删除的数据。本文将介绍Oracle数据库中的回收站功能以及…...

投稿注意!APA格式超全示例详解,原本28天能录用,可能要拖延2个月

为什么同一本期刊有论文28天录用,有论文10个月才录用?结合近期征稿的这本经管类SSCI期刊,小编(Unionpub学术)整理了部分影响录用的几个因素,准备提交此期刊的作者可自查参考下: (参…...

【Python】Web学习笔记_flask(1)——模拟登录

安装flask pip3 install flask 第一部分内容&#xff1a; 1、主页面输出hello world 2、根据不同用户名参数输出用户信息 3、模拟登录 from flask import Flask,url_for,redirectappFlask(__name__)app.route(/) def index():return hello worldapp.route(/user/<uname…...

css单行文本省略号多行文本省略号

设置单行文本省略号的写法 &#xff1a; 先设置宽固定的宽度 &#xff1a;width: 300px; 设置不换行 &#xff1a;white-space:nowrap; 设置省略号&#xff1a;text-overflow: ellipsis; 裁剪多余的内容/溢出的内容&#xff1a;overflow: hidden; width: 200px; white-space:…...

信号槽中的函数重载

信号槽中的函数重载 QT4的方式QT5的方式函数指针重载函数QT5信号函数重载解决方案 总结 QT4的方式 Qt4中声明槽函数必须要使用 slots 关键字, 不能省略。 信号函数&#xff1a; 槽函数&#xff1a; mainwondow: cpp文件&#xff1a; #include "mainwindow.h"…...

计算机视觉(五)深度学习基础

文章目录 深度学习基础卷积神经网络与传统神经网络区别深度学习与神经网络的区别 目标函数选择合适的目标函数Softmax层 改进的梯度下降梯度消失的直观解释激活函数学习步长SGD的问题Momentum动量Nesterov MomentumAdagradRMSpropAdam 各种梯度下降算法比较关于算法选择的建议B…...

ES6学习-Generator

Generator 种异步编程解决方案 函数会返回一个遍历器对象语法上:Generator 函数是一个状态机&#xff0c;封装了多个内部状态。形式上:Generator 函数是一个普通函数;有两个特征。一是&#xff0c;function关键字与函数名之间有一个星号&#xff1b;二是&#xff0c;函数体内部…...

Flowable-服务-微服务任务

目录 定义图形标记XML内容界面操作 定义 Sc 任务不是 BPMN 2.0 规范定义的官方任务&#xff0c;在 Flowable 中&#xff0c;Sc 任务是作为一种特殊的服务 任务来实现的&#xff0c;主要调用springcloud的微服务使用。 图形标记 由于 Sc 任务不是 BPMN 2.0 规范的“官方”任务…...

opencv03-补充-vector的操作

opencv03-补充-vector的操作 参考&#xff1a;https://www.runoob.com/w3cnote/cpp-vector-container-analysis.html 构造方法(具体介绍看API文档) class Student {public:private:string name;};int main() {vector<int>();vector<int> v1;vector<Student&g…...

二叉树(C语言)

文章目录 1.树1.1概念1.2相关定义1.3 表示&#xff08;左孩子右兄弟&#xff09; 2.二叉树2.1概念2.2特殊的二叉树1. 满二叉树&#xff1a;2. 完全二叉树&#xff1a; 2.3二叉树的性质2.4练习 3.二叉树的存储结构1. 顺序存储2. 链式存储 4.完全二叉树的代码实现4.1堆的介绍1.堆…...

介绍下Django中的表单(forms)模块中的类forms.CharField

在Django中&#xff0c;forms.CharField() 是用于定义表单字段的类&#xff0c;它属于 Django 的表单&#xff08;forms&#xff09;模块。CharField 是用于处理字符型数据的表单字段类。它允许用户在表单中输入文本数据&#xff0c;并对该数据进行验证和处理。 forms.CharFie…...

元宇宙与数字孪生的异同?

随着数字孪生和元宇宙两个概念的爆火&#xff0c;人们对这两个“异物”也越来越好奇&#xff0c;这都是什么意思&#xff1f;听起来都差不多&#xff0c;是一样的嘛&#xff1f;本文就用最简单的话语带大家了解一下二者之间的异同。 首先来说数字孪生和元宇宙的概念 数字孪生是…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...