Spring 事务 (编程式 声明式, Spring 事务传播机制)

事务

事务是一组操作的集合, 是一个不可分割的整体
事务会把所有的操作作为一个整体, 一起向数据库提交或是撤销操作请求. 所以这组操作要么同时成功, 要么同时失败

Spring 中事务的实现

  1. 编程式 (手动写代码操作事务)
  2. 声明式 (通过注解自动开启和提交事务)

编程式事务

  1. 开启事务 / 获取事务, 通过两个 Spring 内置对象获取
    • DataSourceTransactionManager 事务管理器, 用来获取, 提交或回滚事务
    • TransactionDefinition 定义事务的属性, 事务隔离级别, 事务传播机制, 回滚规则 …
  2. 提交事务
  3. 回滚事务

Spring 通过 DataSourceTransactionManager (事务管理器) 和 TransactionDefinition (事务的属性) 来获取事务

@Controller
public class BasicController {// 获取事务管理器@Autowiredprivate DataSourceTransactionManager dataSourceTransactionManager;// 定义事务的属性@Autowiredprivate TransactionDefinition transactionDefinition;@RequestMapping("/registry")public String registry() {// 获取事务 / 开启事务 (transactionStatus 为事务的一个状态, 可以理解为数据库的一个快照)TransactionStatus transactionStatus =dataSourceTransactionManager.getTransaction(transactionDefinition);// 业务逻辑User user = new User();user.setAge(18);user.setName("zrj");//提交事务dataSourceTransactionManager.commit(transactionStatus); //回滚事务
//        dataSourceTransactionManager.rollback(transactionStatus); return "ok";}
}

声明式事务

使用注解 @Transactional
既是类注解, 也是方法注解
会对注解范围内所有的 public 修饰的方法 生效

@Transactional :
如果方法执行过程中, 出现异常, 且未被捕获, 就进行事务回滚.
如果异常被程序捕获, 则方法对异常无感知, 认为本次执行成功, 就会进行事务提交. 若异常被捕获仍想回滚:

  • 将捕获的异常再次抛出
  • 手动回滚事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@RestController
public class PathVariableController {@Transactional()@RequestMapping("/registry")public String registry() {User user = new User();user.setAge(18);user.setName("zrj");return "ok";}
}

@Transactional 注解的常用属性

  1. rollbackFor : 异常回滚属性. 执行能够触发事务回滚的异常类型, 默认只有 运行时异常和 error 才会触发事务回滚, 其他类型异常并不会触发回滚操作
  2. Isolation : 事务的隔离级别. 默认为 Isolation.DEFAULT
  3. propergation : 事务的传播机制, 默认值为 Propergation.REQUIRED

事务的隔离级别解决 多个事务同时调用一个数据库的问题
事务的传播机制解决 一个事务在多个节点(方法)中传播的问题

在这里插入图片描述


Spring 事务的传播机制 – 7种

Propergation.REQUIRED : 如果当前存在事务, 则加入该事务, 如果当前不存在事务, 则创建一个事务
Propergation.SUPPORTS : 如果当前存在事务, 就加入该事务, 如果当前不存在事务,就以非事务的方式继续执行
Propergation.MANDATORY : 强制性, 如果当前存在事务, 就加入该事务, 如果当前不存在事务, 就报错
Propergation.REQUIED_NEW : 创建一个新事务, 如果当前存在事务, 就将当前事务挂起
Propergation.NOT_SUPPORTED :非事务的方式运行, 如果当前存在事务, 就将当前事务挂起
Propergation.NEVER : 以非事务的方式运行, 如果当前存在事务, 就抛出异常
Propergation.NESTED : 如果当前存在事务, 则创建一个事务作为当前事务的嵌套事务/子事务来运行, 如果没有事务, 则创建一个事务

NESTED & REQUIRED

  • 如果事务全部执行成功, 二者的结果是一样的
  • 如果事务部分执行成功, 部分执行失败, REQUIRED 加入事务 会导致整个事务 全部回滚, NESTED 嵌套事务 可以实现 部分回滚 (savepoint 机制)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Module外贸主题开心版下载-v5.7.0版本WordPress企业模板

主题下载地址:Module外贸主题开心版下载-v5.7.0版本 Module主题介绍:采用全新模块化开发,首页模块可视化拖拽自由组合,可自定义搭建出不同行业适用的企业网站。同时主题全面支持WPML多语言切换,可轻松搭建外贸网站。W…

torchEEG工具箱

文章信息: 题目:TorchEEGEMO:基于脑电图的情绪识别深度学习工具箱 期刊:Expert Systems with Applications 环境:pytorch 1.11.0 CUDA 11.3 摘要: ​ 一个python工具箱TorchEEG,将工作流程分为五个模块…

学习STM32第十六天

RTC实时时钟 一、简介 RTC是一个独立的BCD格式定时器,提供一个时钟日历,两个可编程报警中断,一个具有中断功能周期性可编程唤醒标志,RTC和时钟配置系统处于后备区域。 通过两个32位寄存器以BCD格式实现秒、分钟、小时&#xff08…

OKCC搭建配置什么样的服务器合适

OKCC呼叫中心系统是一种采用软硬件结合的架构方式、及分布式的IP技术,从多角度为企业提供整合的一体化解决方案。因此,搭建OKCC呼叫中心系统所使用的服务器应该满足以下几点要求: 稳定性:服务器需要具有较高的稳定性和可靠性&…

Java 异步编程进阶:CompletableFuture 完全指南

在现代应用程序开发中,异步编程已经成为不可或缺的一部分。Java提供了许多用于异步编程的工具和框架,其中最强大的之一是 CompletableFuture。CompletableFuture 不仅简化了异步任务的管理,而且提供了丰富的 API,使得开发人员可以…

Linux常见指令解析

基础命令行 1、rm可以删除文件(rm -d /path/to/directory或者rm -r /path/to/directory) 2、ls是展开文件 在linux中,“ll”是“ls -l”命令的别名,ls命令用于显示指定工作目录下之内容,参数“-l”表示除文件名称外&…

STM32之不使用MicroLIB

一、microlib介绍 microlib 是缺省 C 库的备选库,功能上不具备某些 ISO C 特性。 microlib 进行了高度优化以使代码变得很小,功能比缺省 C 库少,用于必须在极少量内存环境下运行的深层嵌入式应用程序。 二、不使用microlib的原因 由于microlib不支持C++开发,因此在使用C…

Java中函数式编程2

Java中的函数参数 在Java中,函数参数有以下三种形式: lambda表达式。方法引用。匿名内部类。 函数参数无论怎么表示,其原则为:1. 参数列表和返回值类型 与 要表示的抽象函数的相同。2. 方法体内部如果要使用外部变量&#xff0c…

element plus el-date-picker type=“datetime“ 限制年月日 时分秒选择

如何限制el-date-picker组件的时分秒选中!!!!!!! 文档 文档在这里:DateTimePicker 日期时间选择器 | Element Plus 它提供的disabled-date给我们来限制日期选择 nice!&…

mysql面试题四(事务)

目录 1.什么是数据库的事务 1. 原子性(Atomicity) 2. 一致性(Consistency) 3. 隔离性(Isolation) 4. 持久性(Durability) 2.事务的并发问题 1. 脏读(Dirty Read&am…

探讨并行速率的评估方法及实验方案

引言 基础概念 并行计算的类型(数据并行、任务并行) 加速比 并行效率 如何评估并行算法 Amdahl定律与Gustafson定律的介绍 工具与平台 CPU/GPU/TPU等硬件平台的选择 软件和编程框架(如OpenMP, MPI, CUDA) 实验案例 简单…

2024年3月洗衣机大家电线上电商(京东天猫淘宝)销量排行榜

鲸参谋监测的线上电商(京东天猫淘宝)平台3月份的洗衣机大家电销售数据已出炉! 根据鲸参谋数据显示,今年3月份,线上电商平台洗衣机的销量累计约224万件,环比增长了29%,环比增长了约29%&#xff…

ubuntu在线安装mysql数据库

1、命令 在ubuntu上安装mysql数据库,通过命令行的方式在线安装。 命令如下: # 更新系统软件包列表 sudo apt update# 安装MySQL Server sudo apt install mysql-server# 安装完成后,启动MySQL服务 sudo systemctl start mysql# 设置MySQL服…

网络变压器在网络分析仪上能通过测试,装上设备后网速达不到呢?

Hqst华轩盛(石门盈盛)电子导读:今天和大家一起探讨网络变压器在网络分析仪上能通过测试,装上设备后网通设备网速达不到的可能原因及其处理方式 一、出现这种情况可能有以下原因: 1.1. 设备兼容性问题:设备其它元器件与 网络…

14、ESP32 经典 Bluetooth

ESP32 上的内置经典蓝牙相比低功耗蓝牙较为简单&#xff0c;可以和 Android 智能手机之间交换数据。下面是官方例程&#xff1a; #include <Arduino.h> #include "BluetoothSerial.h"// 检查蓝牙是否正确启用 #if !defined(CONFIG_BT_ENABLED) || !defined(CO…

MATLAB绘制复杂分段函数图像

MATLAB绘制复杂分段函数图像 clc;close all;clear all;warning off;%清除变量 rand(seed, 200); randn(seed, 200) % 定义 x 范围和分辨率 x linspace(-2, 2, 1000); % 初始化 y 数组 y zeros(size(x)); % 分段定义函数 y(x < 0) x(x < 0).^2; y(x > 0 …

一个例子搞懂模型训练和参数更新的过程

模型训练和更新参数的过程是机器学习中的核心。这个过程通常涉及多个步骤&#xff0c;包括前向传播、损失计算、反向传播和参数更新。下面我将通过一个简单的线性回归模型的例子来解释这些步骤&#xff1a; 线性回归模型示例 假设我们有一个简单的线性关系 y w x b ywxb yw…

使用Termux在Android设备上编译运行SpecCPU2006

Spec CPU 2006 的使用说明&#xff08;曲线救国版&#xff09; 因本部分实验用到的Spec CPU2006依赖于多个编译工具包&#xff0c;因此对源码的编译要在配置好环境的Linux设备上运行&#xff0c;根据实验发现&#xff0c;现有的环境&#xff08;包括adb和termux&#xff09;都不…

FreeRTOS之动态创建任务与删除任务

1.本文是利用FreeRTOS来动态创建任务和删除任务。主要是使用FreeRTOS的两个API函数&#xff1a;xTaskCreate()和vTaskDelete()。 任务1和任务2是让LED0、LED1闪烁。任务3是当按键按下时删除任务1。 使用动态创建任务时&#xff0c;需要动态的堆中申请任务所需的内存空间&…

Jmeter redis连接测试

Jmeter连接redis获取数据&#xff0c;一直连不上报错。最后只能通过java代码连接测试&#xff0c;最后只能自己动手。 import redis.clients.jedis.*;import java.io.IOException; import java.util.HashSet; import java.util.Set;/*** 单机版的Jedis连接池的用法*/ public c…