当前位置: 首页 > 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…...

在Windows系统安装Docker

在 Windows 上安装 Docker&#xff0c;核心是安装 Docker Desktop&#xff08;官方 GUI 工具&#xff09;&#xff0c;并启用 WSL 2&#xff08;推荐&#xff0c;性能最好&#xff09;。以下是最新、最稳的完整教程&#xff08;Win10/Win11 通用&#xff09;。 一、先检查系统与…...

Qwen3.5-2B保姆级教程:Gradio界面快捷键/拖拽上传/历史搜索技巧

Qwen3.5-2B保姆级教程&#xff1a;Gradio界面快捷键/拖拽上传/历史搜索技巧 1. 前言&#xff1a;认识Qwen3.5-2B Qwen3.5-2B是通义千问团队推出的轻量化多模态基础模型&#xff0c;属于Qwen3.5系列的小参数版本&#xff08;20亿参数&#xff09;。这个模型主打低功耗、低门槛…...

AI未来3-5年十大核心方向

基于对人工智能领域趋势的分析&#xff0c;未来3-5年&#xff0c;以下十个核心方向将深刻影响技术演进与社会变革。1. 多模态大模型与全能模型 (Omni-Multimodal Models)技术发展&#xff1a;多模态预训练大模型将成为AI技术栈的标配&#xff0c;能够无缝理解和生成文本、图像、…...

救命!SQL注入居然这么好懂|小白零门槛实操复盘

家人们&#xff01;网安进阶必冲的“入门王者”漏洞非SQL注入莫属——全程贯穿Web渗透&#xff0c;红队老哥打攻击必用它&#xff0c;蓝队防守也得重点盯防&#xff01;纯干货实操双在线&#xff0c;刚入坑的网安小白直接码住&#xff0c;照着学不踩坑&#xff5e;先给各位搭子…...

基于Python的PC微信自动化探索:uiautomation+OpenCV+EasyOCR都

本课概览 Microsoft Agent Framework (MAF) 提供了一套强大的 Workflow&#xff08;工作流&#xff09; 框架&#xff0c;用于编排和协调多个智能体&#xff08;Agent&#xff09;或处理组件的执行流程。 本课将以通俗易懂的方式&#xff0c;帮助你理解 MAF Workflow 的核心概念…...

Freertos堆管理算法解析:如何为STM32选择最优内存方案

FreeRTOS堆管理算法深度解析&#xff1a;STM32工业控制项目中的内存优化实践 在工业控制领域&#xff0c;实时性和可靠性是系统设计的核心诉求。STM32系列微控制器凭借其优异的性能价格比&#xff0c;成为众多工业设备的首选平台。而FreeRTOS作为一款轻量级实时操作系统&#x…...

Spring IOC 源码学习 事务相关的 BeanDefinition 解析过程 (XML)反

从0构建WAV文件&#xff1a;读懂计算机文件的本质 虽然接触计算机有一段时间了&#xff0c;但是我的视野一直局限于一个较小的范围之内&#xff0c;往往只能看到于算法竞赛相关的内容&#xff0c;计算机各种文件在我看来十分复杂&#xff0c;认为构建他们并能达到目的是一件困难…...

Halcon图像分析小技巧:除了平均亮度,Deviation灰度偏差能告诉你什么?

Halcon图像分析进阶&#xff1a;灰度偏差(Deviation)的深度应用与实战解析 在工业视觉检测领域&#xff0c;我们常常过于关注图像的"平均亮度"这一指标&#xff0c;却忽略了另一个同样重要的参数——灰度偏差(Deviation)。就像医生不能仅凭体温判断病人健康状况一样&…...

从锁模到电光调制:光学频率梳技术全解析与五大主流品牌竞品对比

一.引言在精密计量与量子技术飞速发展的今天&#xff0c;光学频率梳&#xff08;Optical Frequency Comb&#xff0c;OFC&#xff09;作为一种革命性的光学测量工具&#xff0c;正在重新定义时间、频率和距离的测量精度。自2005年诺贝尔物理学奖授予光梳技术以来&#xff0c;这…...

Mem Reduct终极指南:一键解决Windows内存卡顿的完整教程

Mem Reduct终极指南&#xff1a;一键解决Windows内存卡顿的完整教程 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct …...