MySQL-事务Transaction详解

文章目录

  • 事务概述
    • 事务基本概念
    • 事务四大特性(ACID)
    • 演示MySQL事务
      • 手动开启事务
      • MySQL默认事务机制
  • 事务的隔离级别
    • 隔离级别基本概述
    • 三种现象
      • 脏读
      • 不可重复读
      • 幻读
    • 查看和设置隔离级别
    • 四种隔离级别及演示
      • 读未提交(read uncommitted)
      • 读提交(read committed)
      • 可重复读(repeatable read)
      • 串行化(serializable)
    • 可重复读的幻读问题

事务概述

事务基本概念

  1. 事务是最小的一个工作单元, 在数据库当中, 事务表示一件完整的事
  2. 一个业务的完成可能需要多条DML语句共同配合才能完成, 例如转账业务, 需要执行两条DML语句, 先更新张三的业务, 再更新李四的业务, 为了保证转账业务不出现问题, 就必须保证这两条DML语句必须同时成功或者同时失败, 所以我们就需要借助业务这一机制来完成
  3. 也就是说使用了事务机制之后, 在同一个事务内部, 多条DML语句会同时成功或者同时失败, 不会出现一部分成功一部分失败的现象
  4. 事务只针对DML语句(insert, delete, update)有效, 因为只有这三个语句是改变表中数据
  5. 事务只针对DML语句有效, 但是在一个事务内部是可以有DQL语句进行结果查询的

事务四大特性(ACID)

  1. 原子性(Atomicity)
    是指事务包含的所有操作要么全部成功,要么同时失败
  2. 一致性(Consistency)
    是指事务开始前,和事务完成后,数据应该是一致的。例如张三和李四的钱加起来是5000,中间不管进行过多少次的转账 操作(update),总量5000是不会变的。这就是事务的一致性。
  3. 隔离性(Isolation)
    隔离性是当多个⽤户并发访问数据库时,⽐如操作同⼀张表时,数据库为每⼀个⽤户开启的事务,不能被其他事务的操作所⼲扰,多个并发事务之间要相互隔离, 隔离性主要解决的是多个事务并发的情况, 这在下面的内容里很重要
  4. 持久性(Durability)
    持久性是指⼀个事务⼀旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作

演示MySQL事务

手动开启事务

在dos命令行窗口的基本操作指令

事务操作基本指令
开启事务start transaction / begin
提交事务(成功提交事务)commit
回滚事务(未成功提交事务)rollback

只要执行上面的commit或者是rollback事务都会结束, 前者是成功提交操作(即所有的操作都生效), 后者是回滚(未成功提交)撤销事务中的所有操作
演示如下
首先是查找一下t_student表中的数据
在这里插入图片描述
现在我们开启事务并执行一些DML操作后commit(成功提交)
在这里插入图片描述
我们发现成功插入了一条数据
现在我们再次开启一个事务并执行一些DML操作后rollback(未成功提交)
在这里插入图片描述
此时我们的stu_no = 13的这行记录并没有被删除…

MySQL默认事务机制

关于MySQL默认的事务机制:
MySQL默认情况下采用的事务机制是 : 自动提交, 所谓自动提交就是只要执行一条DML语句, 就会自动的开启事务并且执行结束之后直接commit, 所以这时候我们rollback是无法进行回滚的…(ACID中的持久性)

测试如下
在这里插入图片描述
分析一下底层的运行机制, 当执行insert语句的时候, 底层自动开启了事务机制, 这条SQL执行结束之后默认进行commit操作, 所以此时rollback并不能使之前的事务回滚

事务的隔离级别

隔离级别基本概述

事物的隔离级别这一块主要针对的就是上面事务四大特性中的隔离性(Isolation)
隔离性感性的理解可以视为两个不同事务之间的"墙", 而隔离级别就是墙的厚度大小

隔离级别脏读不可重复读幻读
读未提交(read uncommitted)存在存在存在
读提交(read committed)不存在存在存在
可重复读(repeatable read)不存在不存在存在(大部分可避免)
串行化(serializable)不存在不存在不存在

事务的隔离级别分为四种(按照隔离程度从低到高)
读未提交 < 读提交 < 可重复读 < 串行化
不同隔离级别产生的现象(按照严重程度从低到高)
脏读 > 不可重复读 > 幻读

三种现象

脏读

官方术语

指的是一个事务读取了另一个事务尚未提交的数据,即读取了另一个事务中的脏数据(Dirty Data)。在此情况下,如果另一个事务回滚了或者修改了这些数据,那么读取这些脏数据的事务所处理的数据就是不准确的。

简单点说就是, 现在假设开启了A, B两个事务, B事务对其中的数据进行了DML语句操作(增删改), B事务并没有提交,此时我们在A事务的内部进行select语句查询, 居然能读取到被B事务增删改的数据, 是不是就说明A, B两个事务之间的隔离级别非常弱(两个事务之间的"墙"厚度很薄)

不可重复读

官方术语
注意, 这里所说的现象是针对同一条SQL来说的, 也就是同一条SQL的结果不一样

指在一个事务内,多次读取同一个数据行,得到的结果可能是不一样的。这是由于其他事务对数据行做出了修改操作,导致数据的不一致性。

翻译一下, 现在假设我们开启了A, B两个事务, 现在在A事务中执行一条DQL查询语句, 此时我们在B事务中使用DML语句中的update语句进行操作A中查询的区间内的数据, B是否提交未知, 我们此时在A中再次执行之前那条DQL语句, 会发现我们前后的数据是不一样的, 为什么说B是否提交未知呢, 因为如果是B执行之前进行select查询, 这种情况就属于脏读(也是不可重复读), 所以说脏读的严重性要大于不可重复读

幻读

官方术语

指在事务执行过程中,前后两次相同的查询条件得到的结果集不一致,可能会变多或变少。

其实就是A, B两个事务开启之后, B中添加几条/删除几条数据, A中可以观测到
关于不可重复度和幻读的区别, 不可重复读是指的是一条数据的内部更新变化, 而幻读指的是添加或者删除某些数据

查看和设置隔离级别

MySQL默认的隔离级别是可重复读(repeatable read)

查看隔离级别(全局/对话)

-- 查看当前会话的隔离级别
-- 也就是当前dos窗口的隔离级别(退出窗口之后失效)
select @@transaction_isolation;
-- 查看当前全局的隔离级别(整个MySQL服务)
select @@global.transaction_isolation;

演示如下
查看当前对话的
在这里插入图片描述
查看全局的
在这里插入图片描述
设置隔离级别
当设置全局的隔离级别之后, 重新打开对话之后对话的隔离级别也会随之改变

-- 设置当前对话的隔离级别
set session transaction isolation level [级别名称]
-- 设置全局的隔离级别
set global transaction isolation level [隔离名称]

下面演示的是把当前对话的隔离级别改成读提交
在这里插入图片描述
这种设置的作用范围就是当前的对话, 一旦对话撤销之后也随之失效

下面演示的是设置全局的隔离级别为读提交
在这里插入图片描述
这种全局的隔离级别一旦设置, 全局范围内都有效, 不能随意切换

四种隔离级别及演示

我们对隔离级别的模拟是通过开启两个dos窗口来进行模拟并发的

读未提交(read uncommitted)

A事务与B事务,A事务可以读取到B事务未提交的数据。这是最低的隔离级别。几乎两个事务之间没有隔离。这种隔离级别是一种理论层面的,在实际的数据库产品中,没有从这个级别起步的。当事务隔离级别是读未提交时,三种现象都存在:脏读,不可重复读,幻读
首先设置一下全局的隔离级别

-- 设置全局的隔离级别为读未提交
set global transaction isolation level read uncommitted;

下面是演示
我们使用的数据演示表是下面的学生表, 这个是初始的数据情况
在这里插入图片描述

事务A事务B
开启事务A在这里插入图片描述开启事务B在这里插入图片描述
插入一条数据在这里插入图片描述
更改一条数据在这里插入图片描述
再次查询一下数据在这里插入图片描述
rollback回滚B事务

通过对比我们很明显的看到, 在B事务没有提交的情况下, 我们A事务就可以查看到B事务中新插入的这条信息的数据(幻读), 也可以查询到B事务中对A事务中信息的更新(不可重复读), 这两个都同时属于脏读, 可见此时的隔离级别是非常低的

读提交(read committed)

A事务与B事务,A事务可以读取到B事务提交之后的数据。Oracle数据库默认的就是这种隔离级别
此时存在不可重复读和幻读
首先设置一下全局的隔离级别为读提交

-- 设置全局的隔离级别为读提交
set global transaction isolation level read committed;

下面是演示

事务A事务B
开启事务A在这里插入图片描述开启事务B在这里插入图片描述
查询一下数据在这里插入图片描述
插入一条数据在这里插入图片描述
更新一条数据在这里插入图片描述
在B事务未提交之前查一下数据在这里插入图片描述
提交B事务在这里插入图片描述
重新查一下A事务数据在这里插入图片描述
提交A事务在这里插入图片描述

分析一下上面的过程, 在B事务没有提前之前, 我们在B中执行的更新删除的操作都不会影响事务A中的查询结果, 也就是避免了脏读, 但是当提交了B事务中的数据, A事务就可以查找出来B事务增加和修改的数据, 也就是存在不可重复读和幻读

可重复读(repeatable read)

这个隔离级别是MySQL数据库默认的。A事务和B事务,A事务开启后,读取了某一条记录,然后B事务对这条记录进行修改并提交,A事务读取到的还是修改前的数据。这种隔离级别称为可重复读。
这个隔离级别可以避开脏读, 不可重复读, 大部分的幻读(待会再说)
首先还是修改一下当前的隔离级别

-- 设置全局的隔离级别为可重复读
set global transaction isolation level repeatable read;

下面是演示

A事务B事务
开启A事务在这里插入图片描述开启事务B在这里插入图片描述
查询一下原始数据在这里插入图片描述
插入一条数据在这里插入图片描述
更新一条数据在这里插入图片描述
再次查看数据在这里插入图片描述
提交事务在这里插入图片描述
再次查看数据在这里插入图片描述
使用for update查询在这里插入图片描述
提交事务在这里插入图片描述

经过上面的演示, 我们发现在B事务提交之前, B事务中执行的任何操作A事务中都无法查询到, 所以这就避免了脏读, 此时我们提交事务B, 再次对A事务中的事务尽心查询, 我们发现这里不仅避免了不可重复读(同一条数据都是一样的), 同时甚至避免了幻读(数据的条数并没有增加), 此时我们使用了for update查询(这是查询语句可以读取到当前最新的数据), 就会发现产生了幻读, 所以我们说MySQL可以最大程度的避免幻读但是也不能完全避免, 至于什么时候可以, 什么时候不可以我们下面会介绍, 还有人疑问这里难道不是不可重复读么, 注意此时select语句发生了变化, 所以此时还是满足可重复读的

串行化(serializable)

这种隔离级别最高,避免了所有的问题,缺点是效率低,因为这种隔离级别会导致事务排队处理,不支持并发。所以我们一般不会采用这种隔离级别
首先还是设置一下全局的隔离级别

set global transaction isolation level serializable;

下面是演示

事务A事务B
开启A事务在这里插入图片描述开启B事务在这里插入图片描述
事务B进行操作在这里插入图片描述
提交事务在这里插入图片描述
此时B事务才可以执行在这里插入图片描述

分析一下, 此时隔离级别为串行化的级别, 此时不允许并发了, 我们发现我们在B事务(后开启)中执行DQL查询操作, 光标就会一直闪烁, 卡在这里不执行, 等待A事务提交完毕之后才可以执行, 当A事务提交之后, B事务自动执行, (45.89 sec 就是B事务等待的秒数), 所以这种情况我们很少用, 不支持并发之后效率很低

可重复读的幻读问题

上面我们说了, MySQL中的可重复读可以尽自己最大的努力来避免产生幻读问题, 但是还是可能存在的, 下面我们详细的分析一下可重复度隔离级别中的幻读问题

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

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

相关文章

sql-labs靶场第十八关测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、寻找注入点 2、注入数据库 ①寻找注入方法 ②爆库&#xff0c;查看数据库名称 ③爆表&#xff0c;查看security库的所有表 ④爆列&#xff0c;查看users表的所有列 ⑤成功获取用户名…

用Spring AI 做智能客服,基于私有知识库和RAG技术

Java智能客服系统运用RAG技术提升答疑精准度 基于Spring ai 的 RAG&#xff08;检索增强生成&#xff09;技术&#xff0c;Java智能客服系统能够利用私有知识库中的信息提供更准确的答疑服务。 它的核心思路是&#xff1a; 首先&#xff0c;将客服QA以Word形式导入到系统中&…

基于FreeRTOS的LWIP移植

目录 前言一、移植准备工作二、以太网固件库与驱动2.1 固件库文件添加2.2 库文件修改2.3 添加网卡驱动 三、LWIP 数据包和网络接口管理3.1 添加LWIP源文件3.2 Lwip文件修改3.2.1 修改cc.h3.2.2 修改lwipopts.h3.2.3 修改icmp.c3.2.4 修改sys_arch.h和sys_arch.c3.2.5 修改ether…

量子门电路开销——T门、clifford门、toffoli门、fredkin门

在量子计算中&#xff0c;T门的成本比Clifford门高出很多倍的原因与量子计算中纠错的实现、物理门操作的复杂性以及容错量子计算架构中的成本评估有关。以下是几个关键原因&#xff0c;解释了为什么 T 门的成本在量子计算中远远高于 Clifford 门&#xff1a; 1. T 门和 Cliffo…

录微课专用提词器,不会被录进视频中的提词器,还能显示PPT中备注的内容

不坑提词器&#xff0c;全称&#xff1a;不坑隐形提词器。是一款能够在截图、录屏、直播过程中隐藏界面的提词器软件。 系统要求&#xff1a;Win10 1024 以上&#xff08;特别提醒&#xff1a;Win7状态下不可隐身&#xff09; ⏬下载 提词器默认放在不坑盒子的安装目录下&…

百易云资产管理运营系统 ufile.api.php SQL注入漏洞复现

0x01 产品描述&#xff1a; 百易云资产管理运营系统&#xff0c;是专门针对企业不动产资产管理和运营需求而设计的一套综合解决方案。该系统能够覆盖资产的全生命周期管理&#xff0c;包括资产的登记、盘点、评估、处置等多个环节&#xff0c;同时提供强大的运营分析功能&#…

SQL Injection | MySQL 手工注入全流程

0x01&#xff1a;MySQL 手工注入 —— 理论篇 手工注入 MySQL 数据库&#xff0c;一般分为以下五个阶段&#xff0c;如下图所示&#xff1a; 第一阶段 - 判断注入点&#xff1a; 在本阶段中&#xff0c;我们需要判断注入点的数据类型&#xff08;数字型、字符型、搜索型、XX 型…

【星闪技术】WS63E模块的WiFi客户端测试

引言 我所计划的WS63E测试要实现MQTT联网&#xff0c;所以首先需要确保开发板连接WiFi。今天来测试一下WiFi功能。 程序分析 WiFi客户端的例子在src/application/samples/wifi/sta_sample目录下。这个例子看上去和hi3861的例子差不多。 这段程序是一个用于嵌入式设备的Wi-F…

国产AI逆袭!零一万物新模型Yi-Lightning超越 GPT-4o

近日&#xff0c;由全球千万用户盲测投票产生的 AI 模型排行榜公布&#xff0c;国产 AI 模型“Yi-Lightning”逆袭&#xff0c;超越了此前长期占据榜首的 GPT-4。 “Yi-Lightning”模型由国内知名 AI 公司零一万物研发&#xff0c;在多个分榜中均名列前茅&#xff0c;其中数学…

HDU RSA

翻译成中文后&#xff1a; 思路&#xff1a;由题易得&#xff0c;d * e y * f ( n ) 1 ,且gcd ( e , f ( n ) ) 1,所以用扩展欧几里得求出 d &#xff0c;但要保证 d 是非负的&#xff0c;最有用快速幂求出每个字符即可。 #include<bits/stdc.h> using namespace std;…

HTML5教程(二)- HTML语法及基本结构

1. 介绍 HTML 超文本标记语言&#xff08;HyperText Markup Language&#xff09;浏览器能够识别和解析的语言&#xff0c;通过标签的形式构建页面结构和填充内容&#xff08;用来描述网页的语言&#xff09;。HTML 不是一种编程语言&#xff0c;而是一种标记语言&#xff08;是…

基于SpringBoot+Vue+uniapp微信小程序的教学质量评价系统的详细设计和实现

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

决策树(1)

原理 基础概念 决策树属于判别模型。 决策树算法属于监督学习方法。 决策树是一种树状结构&#xff0c;通过做出一系列决策&#xff08;选择&#xff09;来对数据进行划分&#xff0c;这类似于针对一系列问题进行选择。 决策树的决策过程就是从根节点开始&#xff0c;测试待分…

UNION 联合查询

1.UNION ALL联合查询 同样为了演示方便&#xff0c;先向 teacher 表插入多条测试数据&#xff1a; INSERT INTO teacher (name,age,id_number,email) VALUES (姓名一,17,42011720200604077X,NULL), (姓名二,18,42011720200604099X,123qq.com), (姓名三,19,42011720200604020X…

007、链表的回文结构

0、题目描述 链表回文结构 1、法1 一个复杂的问题可以拆解成几个简单的问题&#xff0c;找中间节点和逆置链表&#xff08;翻转链表&#xff09;之前都做过。 class PalindromeList { public://1、找中间节点ListNode* FindMid(ListNode* A){if (A nullptr || A->next …

流程图 LogicFlow

流程图 LogicFlow 官方文档&#xff1a;https://site.logic-flow.cn/tutorial/get-started <script setup> import { onMounted, ref } from vue import { forEach, map, has } from lodash-es import LogicFlow, { ElementState, LogicFlowUtil } from logicflow/core …

Jmeter监控服务器性能

目录 ServerAgent 安装 打开Jmeter ServerAgent 在Jmeter上监控服务器的性能比如CPU&#xff0c;内存等我们需要用到ServerAgent&#xff0c;这里可以下载我分享 ServerAgent-2.2.3.zip 链接: https://pan.baidu.com/s/1oZKsJGnrZx3iyt15DP1IYA?pwdedhs 提取码: edhs 安装…

FPGA图像处理之均值滤波

文章目录 一、什么是图像滤波&#xff1f;1.1 噪声类型1.2 滤波类型 二、均值滤波原理2.1 3*3窗口滑动过程2.2 图像扩展 三、Matlab实现均值滤波四、FPGA实现均值滤波4.1 生成 3*3 矩阵4.2 仿真3*3矩阵4.3 计算均值4.4 仿真均值滤波 一、什么是图像滤波&#xff1f; 图像滤波是…

得物App3D创新应用引关注,世界设计之都大会启幕

近日&#xff0c;2024世界设计之都大会&#xff08;WDCC&#xff09;在上海盛大启幕。此次大会以“设计无界 新质生长”为主题&#xff0c;汇聚了全球设计领域的精英与前沿成果&#xff0c;展现了设计作为新质生产力的巨大潜力。主场展览占据了整整3个楼面&#xff0c;总面积达…

C#学习笔记(十)

C#学习笔记&#xff08;十&#xff09; 第七章 对象的构造方法与实例方法一、对象的构造方法1. 构造方法初识2. 构造方法的创建3. this关键字4. 构造方法的规范和重载4.1 构造方法的规范 5. 对象初始化器5.1 对象初始化器和构造方法的区别 二、对象的实例方法1. 简单应用2.实例…