MySQL事务机制

目录

原子性

持久性 

隔离性

隔离级别(并发事务之间的关系)

读未提交

读已提交

可重复读

串行化(最严格的隔离级别)

一致性

问题

不可重复读性(已经提交的数据)

什么是脏读问题(未提交的数据)?

幻读

保存点

自动提交机制--autocommit

会话隔离级别与全局隔离级别


原子性

事务原子性是指在数据库操作中,事务要么全部执行成功,要么全部执行失败,不存在部分执行成功部分执行失败的情冿。事务原子性保证了数据的一致性和可靠性,确保数据库中的数据不会出现不一致的情况。当一个事务中的所有操作都成功完成时,事务被提交;当有任何一个操作失败时,事务将会被回滚,使得数据回到事务开始之前的状态。这样保证了数据库中的数据始终处于一致的状态。

持久性 

事务持久性是指一旦事务成功提交,其所做的改变就会永久保存在数据库中,即使系统发生故障或意外断电也不会丢失。数据库系统通过将事务的操作记录持久化保存在磁盘上来实现事务的持久性,确保数据库的一致性和可靠性。要实现事务的持久性,数据库系统通常会使用日志记录和事务提交机制来保证事务的持久性。

隔离性

隔离级别(并发事务之间的关系)

隔离怎么理解?

隔离级别是相对于自己的事务还是其他事务

-->是相对于自己会话的事务来说的,先简单的拿读已提交为例;

自己会话的事务读取其他客户端的事务的数据必须是已经提交的;并不是自己设置事务为读已提交,其他客户端的事务就读不到的我的事务的数据了,有可能其他事务设置的是读未提交,如此,可以实时的获取我的事务的数据;

读未提交

那么什么是读未提交级别呢?

-->可以读到未提交的数据。就这么简单。

默认情况下,我开启了一个事务,还向表中插入了一行元组,但是我没有提交事务,由于事务的隔离性,其他事务是读不到我新插入的一行数据的,只能读到这个事务之前的数据;

但是,现在我把事务隔离级别设置为是“读未提交”,那么即便我不提交事务,其他客户端也可以读到我这个新插入的数据了;

总结:读未提交隔离级别下,事务的任何修改都是透明的,,都可以被其他客户端读到,但是他们没法访问;

代码示例:

设置全局事务隔离级别(读未提交):

Set global transaction isolation level read uncommitted;

查看全局事务级别:

SELECT @@transaction_isolation;

 向表中插入一行数据但不commit,我们会发现右边的事务也能够看到新数据;

解释:

开启事务,向price表中插入一行数据,但不提交,再打开一个客户端,查看price表,发现新增了一条数据,

insert into price values(1,"小小",500);

事务回滚,重新查看price表,发现刚才的元组没了;

读已提交

只能读到其他事务已经提交的数据;如果别的客户端不提交事务,那么我们就读到的始终是旧数据;

设置隔离级别SQL语句: set  session transaction isolation level read committed;

可重复读

可重复读,我们可以这么理解,我们设置当前会话隔离级别是可重复读,那么意思就是"放心读,不用担心数据会更改",事实是,他跟读已提交的区别就在于即便有其他事务把数据更改了提交了,我当前事务读到的数据依旧是原来的数据,不会改变,这就是可重复读;

所以可重复读级别下读到的数据是其他事务开始之前的数据;即便其他事务提交了,读到的数据也不会发生变化;

串行化(最严格的隔离级别)

将所有的事务串行执行,同一时间只有一个事务在执行;类似与加锁;--->效率问题

一致性

一致性简单来讲就是对数据的操作要合理;

比如:小红转给小明100块钱,那最后的结果就是小红余额减少100元,小明的余额增加100元,这就是要保持一致,如果小红的余额没减货或者小明的余额没增,那就是不一致;

 一致性算是一种目的和要求,通过前面的原子性,隔离性,持久性来保证事务的一致性;

问题

不可重复读性(已经提交的数据)

在MySQL事务中,不可重复读(non-repeatable read)是指在同一个事务中多次读取相同的数据,但在读取过程中数据发生了变化,导致多次读取的结果不一致的情况。这可能会导致事务在处理过程中出现异常或错误的情况。

不可重复读的典型例子如下:

  1. 事务A在读取一行数据后,事务B修改了这行数据,然后事务A再次读取同一行数据,此时读取的数据已经发生了变化,造成不一致。
  2. 事务A在读取一批数据后,事务B删除了其中的一部分数据,然后事务A再次读取同一批数据,发现有部分数据已经被删除,导致不一致。

简单来说就是,我没有把握确定当前数据具体的值,因为他随时可能变化; 

什么是脏读问题(未提交的数据)?

其他事务读到的数据可能被修改了,比如,事务A开启事务,事务B读到了一个数据行。但是B事务读取完毕后,事务A马上就修改了那一个数据行,所以就造成了事务B拿到的数据是"假数据",这就是"脏读“;

幻读

幻读是指一个事务在执行过程中,按照相同的查询条件多次查询,由于其他事务插入或删除了满足查询条件的新数据,导致结果集的行数发生变化。

重点:其他事务插入货删除数据,导致的结果集发生变化;

哪种隔离级别会出现幻读现象?

-->读未提交,读已提交;

这两种都是我在执行事务的时候可以读到别的事务操作过的数据;

保存点

SQL语句:savepoint 保存点名称;

开启事务后,可以通过设置保存点决定回滚到哪一次保存前的内容

示例:

准备好的一个表;

 我向表中插入了两行数据,插入后保存了两个保存点;

 现在我们回到保存点s1处的状态;我们会发现表就是s1保存时的状态;

 现在试试能不能回到s2了;-->是无法回到时间点后面的保存点的;

自动提交机制--autocommit

SQL语句:Set autocommit=1(默认就是自动提交的)

 因为默认就是自动提交的所以我这里设为不自动提交;

 什么是默认提交呢?

-->顾名思义,就是我执行完任意一条SLQ语句后都相当于是一个事务,自动commit;

我们平时写的一个SQL语句就是一个事务;

下面我们来验证下,在不自动提交的情况下是什么样的:

首先,左边的我设置为不自动提交,右边的设置为自动提交,隔离级别都是可重复读;

 我插入在左边的客户端向表中插入了一行数据,但是不commit;我们发现右边查不到新的数据,这是因为左边的事务没有提交,一个SQL语句已经不再是一个完整的事务了。

下面把左边的事务提交了试试看,发现左边的事务提交了之后,右边才可以看到新的数据行;

会话隔离级别与全局隔离级别

会话隔离级别:设置当前客户端的隔离级别,不会影响到其他的客户端的隔离级别。

全局隔离级别:设置所有客户端的隔离级别,对象是该服务端对应的所有的客户端;

简单来讲,一个是全局变量,一个是局部变量;使用的时候是局部优先,因此我们修改会话级别的时候记得修改当前会话的级别,如果修改的是全局的隔离级别,其实还是使用的局部的会话隔离级别,记得检查一下;

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

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

相关文章

Cadence学习笔记之---直插元件的封装制作

目录 01 | 引 言 02 | 环境描述 03 | 操作步骤 04 | 结 语 01 | 引 言 在之前发布的Cadence小记中,已经讲述了怎样制作热风焊盘,贴片(SMD)焊盘、通孔、过孔,以及贴片元件的封装。 本篇关于Cadence的小记主要讲如何制作直插元件的封装。 …

【第四十周】文献阅读:用于检索-增强大语言模型的查询与重写

目录 摘要Abstract用于检索-增强大语言模型的查询与重写研究背景方法论基于冻结LLM的重写方案基于可训练重写器的方案重写器预热训练(Rewriter Warm-up)强化学习(Reinforcement Learning) 创新性实验结果局限性总结 摘要 这篇论文…

java学习总结(if switch for)

一.基本结构 1.单分支if int num 10; if (num > 5) {System.out.println("num 大于 5"); } 2.双分支if-else int score 60; if (score > 60) {System.out.println("及格"); } else {System.out.println("不及格"); } 3.多分支 int…

yum的基本操作和vim指令

在我们的手机端或者Windows上下载软件,可以在相应的应用商店或者官网进行下载,这样对于用户来说十分的方便和便捷。而在Linux上,也有类似的安装方式,我们来一一了解一下。 Linux安装软件的3种方法 源代码安装 在Linux下安装软件…

C++ CUDA开发入门

CUDA开发笔记 文章目录 CUDA开发笔记[toc]1 概述2 环境3 命令行编译4 CMAKE引入CUDA5 vscode开发CUDA6 Qt中使用CUDA-CMake7 QMake配置CUDA8 核函数9 核函数调用9.1 核函数调用语法9.2 执行配置参数详解9.3 关键调用步骤9.4 重要注意事项9.5 调用示例分析9.6 最佳实践建议 10 线…

llm开发框架新秀

原文链接:https://i68.ltd/notes/posts/20250404-llm-framework3/ google开源ADK-Agent Development Kit 开源的、代码优先的 Python 工具包,用于构建、评估和部署具有灵活性和控制力的复杂智能体项目仓库:https://github.com/google/adk-python 2.6k项目文档:Age…

VM——相机拍照失败

1、问题:相机频闪触发,在MVS中正常出图,在VM中出现拍照失败 2、解决: 1、首先排查网络设置(巨帧是否设置) 2、电脑的所有防火墙是否关闭 3、在MVS中恢复相机的设置参数为默认参数,删除VM中的全…

【时频谱分析】小波分析

算法配置页面,也可以一键导出结果数据 报表自定义绘制 获取和下载【PHM学习软件PHM源码】的方式 获取方式:Docshttps://jcn362s9p4t8.feishu.cn/wiki/A0NXwPxY3ie1cGkOy08cru6vnvc

怎么免费下载GLTF/GLB格式模型文件,还可以在线编辑修改

​ 现在非常流行glb格式模型,和gltf格式文件,可是之类模型网站非常非常少 1,咱们先直接打开http://glbxz.com 官方glb下载网站 glbxz.com 2 可以搜索,自己想要的模型关键词 3,到自己想下载素材页面 4,…

【6】深入学习http模块(万字)-Nodejs开发入门

深入学习http模块 前言http一个Web服务器项目创建代码运行代码解析 Server属性:keepAlive属性:keepAliveTimeout属性:maxHeaderSize属性:requestTimeout属性:maxRequestsPerSocket方法:close()方法&#xf…

buuctf sql注入类练习

BUU SQL COURSE 1 1 实例无法访问 / Instance cant be reached at that time | BUUCTF但是这个地方很迷惑就是这个 一个 # 我们不抓包就不知道这个是sql注入类的判断是 get 类型的sql注入直接使用sqlmap我们放入到1.txt中 目的是 优先检测 ?id1>python3 sqlmap.py -r 1.t…

(即插即用模块-特征处理部分) 三十二、(TGRS 2024) MDAF 多尺度双表示对齐过滤器

文章目录 1、Multiscale Dual-Representation Alignment Filter2、代码实现 paper:SFFNet: A Wavelet-Based Spatial and Frequency Domain Fusion Network for Remote Sensing Segmentation Code:https://github.com/yysdck/SFFNet 1、Multiscale Dual-…

Python 中为什么 hash(-1) == hash(-2)?

推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 让我们从哪里开始?获取源代码!让我们浏览一下这是正确/完整的答案吗?结论前几天在浏览 Reddit 时,我在 r/Python 上看到了这样一个…

基于PySide6与pycatia的CATIA绘图比例智能调节工具开发全解析

引言:工程图纸自动化处理的技术革新 在机械设计领域,CATIA图纸的比例调整是高频且重复性极强的操作。传统手动调整方式效率低下且易出错。本文基于PySide6pycatia技术栈,提出一种支持智能比例匹配、实时视图控制、异常自处理的图纸批处理方案…

macos下 ragflow二次开发环境搭建

参考官网链接 https://ragflow.io/docs/dev/launch_ragflow_from_source虚拟环境 git clone https://github.com/infiniflow/ragflow.git cd ragflow/ # if not pipx, please install it at first pip3 install pipxpipx install uv uv sync --python 3.10 --all-extras 安装 …

libva之ffavdemo分析

ffavdemo 代码库实现了一个基于FFmpeg和VAAPI的硬件加速视频解码与渲染框架,主要用于演示视频解码与渲染的完整硬件加速流程。支持多种渲染后端(X11、DRM、EGL),适应不同显示环境。包含视频处理过滤器,可进行格式转换和…

JavaWeb 课堂笔记 —— 09 MySQL 概述 + DDL

本系列为笔者学习JavaWeb的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖SpringMyBatisSpringMVCSpringBoot等)》,章节分布参考视频教程,为同样学习…

精品推荐 | 湖仓一体电商数据分析平台实践教程合集(视频教程+设计文档+完整项目代码)

精品推荐,湖仓一体电商数据分析平台实践教程合集,包含视频教程、设计文档及完整项目代码等资料,供大家学习。 1、项目背景介绍及项目架构 2、项目使用技术版本及组件搭建 3、项目数据种类与采集 4、实时业务统计指标分析一——ODS分层设计与数…

【人工智能】大语言模型多义词解析技术揭秘——以“项目“歧义消解为例

今天田辛老师和小伙伴探讨了一个有趣的多义词问题, 在人工智能技术日新月异的今天,大语言模型(LLM)对自然语言的理解能力已经达到令人惊叹的水平。大模型到底是如何去区分多义词的? 比如:当用户提到"…

【maxENT】最大熵模型(Maximum Entropy Model)R语言实现

文章目录 一、相关package介绍1.1 dismo 包1.2 raster包1.3 常见问题与解决 二、代码示例 🟢🟠先看:【maxENT】最大熵模型(Maximum Entropy Model)介绍与使用(maxENT软件) ASCII文件太大&#…