事务的隔离级别与Spring事务的传播机制

news2024/11/25 18:25:42

目录

事务的隔离性

事务的隔离级别

读未提交

读已提交

 可重复读

串行化

Spring事务的传播机制

支持当前事务

不支持当前事务

嵌套事务


事务的隔离性

事务的隔离性是事务的四大特性之一,数据库允许多个事务并发操作数据,为了尽可能地避免并发操作数据所带来的隐患,就需要依赖于事务地隔离性。事务的隔离性分为多个等级,包括:读未提交、读已提交、可重复读以及串行化,隔离等级依次提高。隔离性也是事务四大特性中唯一一个可以设置级别的特性。

事务的隔离级别

读未提交

事务最低隔离级别,该级别事务可以读取别的事务未提交时的数据。未提交的数据可能发生回滚,这时读取到的数据就是不存在的,这个数据称为脏数据,这个问题称为脏读

读已提交

该级别的事务读取到的数据都是提交过的数据,因此不会出现脏读问题。但是在该事务读取数据时,别的事务可以提交事务,因此在这次的事务中,可能出现使用同样的查询语句,查询出的结果却不同,这种现象称为不可重复读:

 可重复读

可重复读是MySQL默认的事务隔离级别,在此级别的事务执行过程中,其他的事务不能操作(包括读和写)已有的数据,因此不会出现不可重复读的情况(实际上该事务创建了一个快照,读取的数据都是基于这个快照的,而不是数据本身,因此事务对数据的修改在未提交时其他事务是看不到的)。但是却可以插入新的数据,这样相同的查询语句,返回的结果集就可能不同,这种情况就称为幻读:

串行化

事务隔离的最高级别,强制事务串行执行,没有并发操作,自然不会出现脏读、不可重复读和幻读的情况。

不可重复读和幻读的区别

  • 不可重复读指的是某条数据被修改(包括删除)而造成的前后读取不一致的情况
  • 幻读指的是由于新插入数据导致读取的数据集不一致。

Spring事务的传播机制

事务的隔离级别保证事务并发执行的稳定性,而事务的传播机制则保证一个事务在多个方法调用时的稳定性。在实际开发中,很少会直接通过事务来操作数据库中的数据,往往会有一条调用链,层层传递:

Spring事务的传播机制大体可分为三类:支持当前事务、不支持当前事务和嵌套事务。

支持当前事务

  • Propagation.REQUIRED: Spring事务的默认传播机制,如果当前调用链已经存在事务,则把该方法或节点加入事务;如果不存在事务,创建事务
  • Propagation.SUPPORTS: 如果当前调用链已经存在事务,则把该方法或节点加入事务;如果不存在事务,以非事务方式执行
  • Propagation.MANDATORY: 如果当前调用链已经存在事务,则把该方法或节点加入事务;如果不存在事务,抛异常

不支持当前事务

  • Propagation.REQUIRES_NEW: 创建新事务;如果当前调用链已经存在事务,把当前事务挂起,并创建新事务,新事务执行完再执行当前事务;
  • Propagation.NOT_SUPPORTED: 以非事务方式运行;如果当前存在事务,把当前事务挂起
  • Propagation.NEVER: 以非事务方式运行;如果当前存在事务,抛异常

嵌套事务

Propagation.NESTED: 当前存在事务,则创建事务嵌套进去;如果不存在事务,则创建事务;

这里的嵌套事务和上述加入事务不同,加入事务就成为一个整体,要么全部成功,要么全部失败;而嵌套事务可以一起成功,但如果嵌套的事务执行失败了,只回滚嵌套的事务,外部事务的提交不受影响。

假如调用链上某个方法或节点不指定事务的传播机制,则遵循其上层节点或方法的事务传播机制。

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

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

相关文章

【JAVA】-【IO流】

文章目录 FileReader读入数据的基本操作FileReader中使用reader()FileWrite写出数据的操作使用FileInputStream、FileOutputStream操作图片缓冲流(字节型)实现非文本文件的复制 复制文本文件也可以使用字节流,但是不要在内存中读出来&#xf…

【Matlab】Elman神经网络遗传算法(Elman-GA)函数极值寻优——非线性函数求极值

往期博客👉 【Matlab】BP神经网络遗传算法(BP-GA)函数极值寻优——非线性函数求极值 【Matlab】GRNN神经网络遗传算法(GRNN-GA)函数极值寻优——非线性函数求极值 【Matlab】RBF神经网络遗传算法(RBF-GA)函数极值寻优——非线性函数求极值 本篇博客将主要介绍Elman神…

【Spring Boot】Spring Boot项目的创建和文件配置

目录 一、为什么要学Spring Boot 1、Spring Boot的优点 二、创建Spring Boot项目 1、创建项目之前的准备工作 2、创建Spring Boot项目 3、项目目录的介绍 4、安装Spring Boot快速添加依赖的插件 5、在项目中写一个helloworld 三、Spring Boot的配置文件 1、配置文件的…

opencv基础48-绘制图像轮廓并切割示例-cv2.drawContours()

绘制图像轮廓:drawContours函数 在 OpenCV 中,可以使用函数 cv2.drawContours()绘制图像轮廓。该函数的语法格式是: imagecv2.drawContours( image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]…

mousedown拖拽功能(vue3+ts)

因为项目有rem适配,使用第三方插件无法处理适配问题,所有只能自己写拖拽功能了 拖拽一般都会想到按下,移动,放开,但是本人亲测,就在div绑定一个按下事件就行了(在事件里面写另外两个事件&#x…

前端架构师的具体职责范围(合集)

前端架构师的具体职责范围1 职责: 1、前端技术选型、架构搭建、制定前端开发规范,并编制相关文档 2、负责搭建前端框架、通用组件方案制定、性能优化相关工作; 3、维护和升级本地开发环境,提高开发效率,提升开发质量; 4、推动…

【深度学习注意力机制系列】—— ECSKNet注意力机制(附pytorch实现)

SKNet(Selective Kernel Network)是一种用于图像分类和目标检测等任务的深度神经网络架构,其核心创新是引入了选择性的多尺度卷积核(Selective Kernel)以及一种新颖的注意力机制,从而在不增加网络复杂性的情…

2.安装Docker-ce

一、删除之前安装的docker(若之前未安装过,此步骤省略…) 进入centos根目录执行以下命令(\ 是linux系统种命令换行符,如果命令过长,可以用\来换行) yum remove docker \ docker-client \ docker-client-latest \ doc…

BL302嵌入式ARM控制器进行SQLite3数据库操作的实例演示

本文主要讲述了在钡铼技术BL302嵌入式arm控制器上运行 SQLite3 数据库的命令示例。SQLite3 是一个轻型的嵌入式数据库,不需要安装数据库服务器进程,占用资源低且处理速度快。 首先,需要将对应版本的 SQLite3 文件复制到设备的 /usr/ 目录下&…

MyCat管理及监控——zookeeper及MyCat-web安装

1.MyCat管理 2.MyCat-eye 3.zookeeper安装 第一步:解压 第二部: 切换目录,创建data文件夹 第三步:修改zookeeper配置文件 这样zookeeper安装及配置就完成了 4.MyCat-web安装 注意mycat-web要与zookeeper关联,…

单元测试到底是什么?应该怎么做?

一、什么是单元测试? 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。至于“单元”的大小或范围,并没有一个明确的标准,“单元”可以是一个函数、方法、类、功能模块或者子系统。单…

Kafka3.0.0版本——Broker(上下线)示例

目录 一、Broker(上下线)示例1.1、三台服务器信息1.2、先启动zookeeper集群,再启动kafka集群1.3、zookeeper客户端工具prettyZoo查看brokers中ids1.4、停止某一台kafka服务,再次查看brokers中ids1.5、重新启动停止的kafka服务&…

笔记——听听前辈们的教学评一体化

精选课程内容 强而有力的知识 做中学,用中学,创中学。 这个技术很难做 关于支架的新理解 有价值 有意义 和 趣味性 权衡,不能为了趣味性舍弃价值 举例说明文 被教成了文学作品 导致所教所学 悄然发生了偏移。 所以教学评如何一直&#xff…

使用Beautiful Soup等三种方式定制Jmeter测试脚本

目录 背景介绍 实现思路 把脚本数据读出,使用正则表达式(re库)匹配关键数据进行修改 把脚本数据读出,使用BeautifulSoup的xml解析功能解析后修改 通过Beautiful Soup Beautiful Soup 具体实现 使用string.Template字符替换…

Jupyter Notebook 遇上 NebulaGraph,可视化探索图数据库

在之前的《手把手教你用 NebulaGraph AI 全家桶跑图算法》中,除了介绍了 ngai 这个小工具之外,还提到了一件事有了 Jupyter Notebook 插件: https://github.com/wey-gu/ipython-ngql,可以更便捷地操作 NebulaGraph。 本文就手把手教你咋在 J…

BpBinder与PPBinder调用过程——Android开发Binder IPC通信技术

在Android系统中,进程间通信(IPC)是一个非常重要的话题。Android系统通过Binder IPC机制实现进程间通信,而Binder IPC通信技术则是Android系统中最为重要的进程间通信技术之一。本文将介绍Binder IPC通信技术的原理,并…

实测有效Window10系统解决文件名过长无法删除或移动问题

问题:window10家庭版,文件名字太长无法对其进行操作 如图 PS:什么注册表方法,压缩方法都没效果 解决: 打开 注册编辑器 进入路径 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem 修改 LongP…

Jenkins 修改默认管理员帐号

1、新增一个新的超级管理员用户,并验证能正常登录 2、进入 Jenkins 用户管理目录: /data/software/jenkins/users 3、修改超级管理文件夹的名称为其他名称,如:mv admin_*** ifadm_*** 4、重启Jenkins容器

snowboy+sherpa-onnx+Rasa+Coqui实现语音音箱【语音助手】

背景 本系列主要目标初步完成一款智能音箱的基础功能,包括语音唤醒、语音识别(语音转文字)、处理用户请求(比如查天气等,主要通过rasa自己定义意图实现)、语音合成(文字转语音)功能。 coqui主要在项目中完成接收rasa响应的内容&…

Postgresql源码(111)dms框架进程信号发送与处理流程

信号处理整体流程 信号从bgworker发出后,主进程将ParallelMessagePending置为true,下次CHECK_FOR_INTERRUPTS()时,会进入信号处理逻辑中:HandleParallelMessages。进入信号处理逻辑后,首先遍历所有现存的ParallelCont…