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

认识 spring 中的事务 与 事务的传播机制


前言

本篇介绍spring中事务的实现方式,如何实现声明式事务,对事物进行参数的设置,了解事务的隔离级别和事务的传播机制;如有错误,请在评论区指正,让我们一起交流,共同进步!


文章目录

  • 前言
  • 1. spring中事务实现的方式
  • 2. 实现声明式事务
  • 3. 设置@Transactional的参数
  • 4. spring 的事务隔离级别
  • 5. 事务的传播机制 - spring
  • 总结

本文开始

1. spring中事务实现的方式

spring中事务实现的方式:
① 编程式事务 - 手动 写代码去操作事务
实现主要过程:开启事务 + 提交事务 + 回滚事务;- 都需要手动
② 声明式事务 - 使用注释操作事务 - 自动
实现主要过程:进入方法自动开启事务,执行完方法自动提交事务,出现错误,自动回滚事务;- 让事务自动开启+自动提交事务

事务目的:实现事务,当程序异常时,会进行回滚操作;

手动实现事务太过于麻烦,一般都使用声明式事务(自动),下面就介绍一下声明式事务;

2. 实现声明式事务

实现方式:
① 在要执行的方法(事务)上,加上注释@Transactional; - 推荐使用
② 在类上加注释@Transactional;

	//在方法上声明事务@Transactionalpublic int add() {//......}//在类上声明事务@Transactionalpublic class User {//......}

3. 设置@Transactional的参数

设置参数的方式:在注释括号中添加参数 - @Transactional(xxx)
@Transactional的参数:

  • value 和 transactionManager : 指定选择哪个事务管理器
  • propagation: 事务的传播行为
  • islation: 设置事务的隔离级别
  • readOnly: 设置事务的为 只读事务
  • timeout: 设置事务的超时时间

4. spring 的事务隔离级别

添加参数示例:@Transactional(islation = Isolatino.DEFAULT)
① Isolatino.DEFAULT: 事务的默认隔离级别 - 以客户端连接事务的隔离级别为主;
② Isolatino.READ_UNCOMMITTED: 读未提交
③ Isolatino.READ_COMMITTED:读已提交
④ Isolatino.REPEATABLE_READ: 可重复读
⑤ Isolatino.SERIALIZABLE_READ: 串行化

客户端可以设置数据库隔离级别:
spring 可认为是一个客户端,可以设置数据库隔离级别;
当前连接的事务隔离级别,也就是spring客户端的隔离级别;

默认事务隔离级别 与 当前连接(spring)的事务隔离级别 默认是一样的;
数据库隔离级别以当前spring设置的事务隔离级别为准,如果没设置就是默认的事务隔离级别;
设置当前连接的事务(当前spring客户端)隔离级别:

//查询事务 - 此命名使用mysql 5.7版本
select @@global.tx_isolation,@@tx_isolation;
//设置事务隔离级别
set session transaction isolation level SERIALIZABLE

问题:设置@Transactional,程序出现异常,但被 try catch捕获,虽捕获但没有处理异常(抛出异常),导致事务没有回滚;
解决方式:让事务在异常情况下也可以实现回滚;
1.抛出异常 - throw e
2. 手动回滚事务: TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();;

5. 事务的传播机制 - spring

什么是事务的传播机制?
事务的传播机制:规定多个事务相互调用,事务的执行行为的机制; (执行行为 = 各方法传递的行为)

事务的传播机制:

  • Propagation.REQUIRED: 默认事务传播机制,当前存在事务,就加入事务;当前没有事务,就创建一个新的事务;
  • Propagation.SUPPORT S: 当前存在事务,就加入事务;当前没有事务,就以非事务方式继续运行;
    【注】以非事务方式运行,事务调用链上遇到异常,不关注,不会再进行回滚操作;(不再是一个整体,各执行各的)
  • Propagation.MANDATORY: 当前存在事务,就加入事务;当前没有事务,就抛出异常;
  • Propagation.REQUIRES_NEW:创建一个新的事务,如果当前存在事务,就把当前事务挂起;- 开启自己新的事务,且相互独立;
  • Propagation.NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,就把当前事务挂起;
  • Propagation.NEVER: 以非事务方式运行,如果当前存在事务,就抛出异常;
  • Propagation.NESTED: 当前存在事务,就创建一个事务作为嵌套事务来运行;如果没有当前事务,相当于默认事务Propagation.REQUIRED;- 嵌套事务在嵌套进事务时会标记保存点,嵌套事务出现异常,会回到标记点(回滚),不影响整个事务链(存档);

在这里插入图片描述
【注】事务c异常,在事务c中做了手动回滚事务的操作;该异常不会被事务a感知到;


总结

✨✨✨各位读友,本篇分享到内容如果对你有帮助给个👍赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

相关文章:

认识 spring 中的事务 与 事务的传播机制

前言 本篇介绍spring中事务的实现方式,如何实现声明式事务,对事物进行参数的设置,了解事务的隔离级别和事务的传播机制;如有错误,请在评论区指正,让我们一起交流,共同进步! 文章目录…...

PHP中的16个危险函数

php中内置了许许多多的函数,在它们的帮助下可以使我们更加快速的进行开发和维护,但是这个函数中依然有许多的函数伴有高风险的,比如说一下的16个函数不到万不得已不尽量不要使用,因为许多“高手”可以通过这些函数抓取你的漏洞。 …...

11、Nvidia显卡驱动、CUDA、cuDNN、Anaconda及Tensorflow Pytorch版本

Nvidia显卡驱动、CUDA、cuDNN、Anaconda及Tensorflow-GPU版本 一、确定版本关系二、安装过程1.安装显卡驱动2、安装CUDA3、安装cudnn4、安装TensorFlow5、安装pytorch 三、卸载 一、确定版本关系 TensorFlow Pytorch推出cuda和cudnn的版本,cuda版本推出驱动可选版本…...

将数据库文件压缩并上传到文件服务器

1.引入上传工具和压缩包工具 <dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId> </dependency> <dependency><groupId>com.zlpay</groupId><artifactId>zl-util-fastdfs…...

docker — 容器网络

一、概述 Docker容器每次重启后容器ip是会发生变化的。 这也意味着如果容器间使用ip地址来进行通信的话&#xff0c;一旦有容器重启&#xff0c;重启的容器将不再能被访问到。 而Docker 网络就能够解决这个问题。 Docker 网络主要有以下两个作用&#xff1a; 容器间的互联…...

腾讯面试题:使用Redis分布式锁可能会出现哪些问题?

嗨大家好&#xff0c;我是你们的小米&#xff01;今天要和大家聊一个有趣的话题&#xff0c;那就是“腾讯面试题&#xff1a;使用Redis做分布式锁可能会出现哪些问题&#xff1f;”没错&#xff0c;就是腾讯大佬们在面试时经常会问到的一个问题&#xff0c;我们来一起深入了解一…...

直接在html中引入Vue.js的cdn来实现Vue3的组合式API

Vue3的组合式API是使用setup函数来编写组件逻辑的。setup函数是Vue3中用于替代Vue2的选项API&#xff08;如data、methods等&#xff09;的一种方式。在setup函数中&#xff0c;你可以访问到一些特殊的响应式对象&#xff0c;并且可以返回一些可以在模板中使用的数据、方法等。…...

YAPi在线接口文档简单案例(结合Vue前端Demo)

在前后端分离开发中&#xff0c;我们都是基于文档进行开发&#xff0c;那前端人员有时候无法马上拿到后端的数据&#xff0c;该怎么办&#xff1f;我们一般采用mock模拟伪造数据直接进行测试&#xff0c;本篇文章主要介绍YApi在线接口文档的简单使用&#xff0c;并结合Vue的小d…...

Java基础篇--Runtime类

介绍 Runtime类用于表示虚拟机运行时的状态&#xff0c;它用于封装JVM虚拟机进程。每次使用java命令启动虚拟机都对应一个Runtime实例&#xff0c;并且只有一个实例。 因此在Runtime类定义的时候&#xff0c;它的构造方法已经被私有化了(单例设计模式的应用)&#xff0c;对象…...

数字后端笔试题(1)DCG后congestion问题

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 已知某模块的DCG结果显示存在congestion&#xff0c;有congestion部分逻辑结构如下图: 问题1: 如何分析该电路有congestion问题的原因&#xff1f; 答&#xff1a;data selecti…...

数据结构:交换排序

冒泡排序 起泡排序&#xff0c;别名“冒泡排序”&#xff0c;该算法的核心思想是将无序表中的所有记录&#xff0c;通过两两比较关键字&#xff0c;得出升序序列或者降序序列。 算法步骤 比较相邻的元素。如果第一个元素大于第二个元素&#xff0c;就交换它们。对每一对相邻…...

SpringBoot复习:(42)WebServerCustomizer的customize方法是在哪里被调用的?

ServletWebServletAutoConfiguration类定义如下&#xff1a; 可以看到其中通过Import注解导入了其内部类BeanPostProcessorRegister。 BeanPostProcessor中定义的registerBeanDefinition方法会被Spring容器调用。 registerBeanDefinitions方法调用了RegistrySyntheticBeanIf…...

年至年的选择仿elementui的样式

组件&#xff1a;<!--* Author: liuyu liuyuxizhengtech.com* Date: 2023-02-01 16:57:27* LastEditors: wangping wangpingxizhengtech.com* LastEditTime: 2023-06-30 17:25:14* Description: 时间选择年 - 年 --> <template><div class"yearPicker"…...

分类过程中的一种遮挡现象

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由6张二值化的图片组成&#xff0c;让A&#xff0c;B中各有3个点&#xff0c;且不重合&#xff0c;统计迭代次数并排序。 其中有10组数据 差值结构 迭代次数 构造平均列A 构造平均列AB…...

下一代服务架构:单体架构-->分布式架构-->微服务(DDD)-->软件定义架构(SDF with GraphEngine)

参考&#xff1a;自己实现一个SQL解析引擎_曾经的学渣的博客-CSDN博客...

excel 之 VBA

1、excel和VBA 高效办公&#xff0c;把重复性的工作写成VBA代码&#xff08;VB代码的衍生物&#xff0c;语法和VBA相同&#xff09;。 首先打开开发工具模式&#xff0c;如果没有选显卡&#xff0c;需要手动打开 打开程序编辑界面 快捷键 altF11一般操作 程序调试&#xf…...

【数学建模】--聚类模型

聚类模型的定义&#xff1a; “物以类聚&#xff0c;人以群分”&#xff0c;所谓的聚类&#xff0c;就是将样本划分为由类似的对象组成的多个类的过程。聚类后&#xff0c;我们可以更加准确的在每个类中单独使用统计模型进行估计&#xff0c;分析或预测&#xff1b;也可以探究不…...

css3新增选择器总结

目录 一、属性选择器 二、结构伪类选择器 三、伪元素选择器 四、UI状态伪类选择器 五、反选伪类选择器 六、target选择器 七、父亲选择器、后代选择器 八、相邻兄弟选择器、兄弟们选择器 一、属性选择器 &#xff08;除IE6外的大部分浏览器支持&#xff09; E&#…...

0基础学C#笔记10:归并排序法

文章目录 前言一、递归的方式二、代码总结 前言 将一个大的无序数组有序&#xff0c;我们可以把大的数组分成两个&#xff0c;然后对这两个数组分别进行排序&#xff0c;之后在把这两个数组合并成一个有序的数组。由于两个小的数组都是有序的&#xff0c;所以在合并的时候是很…...

nlohmann json:通过for遍历object和array

object和array可以使用数for进行遍历: #include <iostream> #include <nlohmann/json.hpp> using namespace std; using json = nlohmann::json;auto checkJsonType(json& x) {if(x.type() == json::value_t::null){cout<<x<<" is null&quo…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...