『 MySQL篇 』:MySQL 事务特性

news2024/11/18 17:39:16

目录

一 . 什么是事务?

二.  事务的操作

​三.  事务的四大特性

四 . 并发事务可能产生的问题

五 . 数据库的隔离级别


一 . 什么是事务?

从概念上来讲,事务是一个有限的数据库操作序列构成,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位 。

举个例子:假如 A 向 B 转账 100 元,先从 A 的账户中扣除100元,再在 B 的账户中增加 100 元,如果已经在 A 帐户中扣除100元,还没来得及扣除B账户中的余额,此时银行系统发生故障,导致A的余额减少了,但是B的余额却没增加,所以就需要事务,将A的钱进行回滚。

二.  事务的操作

使用以下SQL语句来开启并提交事务

# 开启一个事务
START TRANSACTION;
#设置保存点 
savepoint point1;
# 多条 SQL 语句
SQL1,SQL2...
#回退事务到保存点
rollback to point1
#回退全部事务
rollback
## 提交事务,有事务操作生效,不能回退
COMMIT;

下面给出一个具体的事务提交的案例:

-- 1.创建一张测试表
CREATE TABLE t27(
	id INT,
	`name` VARCHAR(32));

-- 2.开始事务
START TRANSACTION
-- 3.设置保存点
SAVEPOINT a
-- 执行dml操作
INSERT INTO t27 VALUES(100,'tom');
SELECT * FROM t27;

SAVEPOINT b
-- 执行dml操作
INSERT INTO t27 VALUES(200,'jack');

-- 回退到b
ROLLBACK TO b
-- 继续回退 a
ROLLBACK TO a
-- 如果这样,表示直接回退到事务开始的状态
ROLLBACK
COMMIT 

这个过程当中,设置了两个保存点a , b ,可以回退到指定位置的保存点,也可以直接对事务进行回退,即不改变表的结构,事务设置完要进行  commit 提交。 

三.  事务的四大特性

  • 原子性 : 事务作为一个整体执行,包含在其中的事务要么全部都执行,要么全部都不执行

原子性的实现通过 undo log 日志来完成,当事务执行更新操作之前,数据库将当前数据行的旧值存储到 undo log 日志当中,如果事务执行过程中出现异常情况,就将事务进行回滚,InnoDB引擎就是利用 undo log 保存下来的记录,将数据恢复到事务开始之前。

  • 隔离性:多个事务进行并发访问时,事务之间应该是相互隔离的,一个事务不应该被其他事务干扰,多个并发事务之间要相互隔离
如果多个事务可以同时操作⼀个 数据,那么就会产⽣脏读、重复读、幻读的问题,MySQL中定义了四种隔离级别提供使用,隔离级别的底层实现是锁或者MVCC,但是屏蔽了加锁的细节。
  • 持久性:事务完成进行提交时,对数据库所做的更改将永久性的保存在数据库中,即使数据库发生故障也不影响

当事务执行更新操作时 , 首先将数据的修改操作记录保存到Redo log 中, 而不是直接修改写入到磁盘的数据文件, 接着以顺序追加的方式写入磁盘,使得写入的操作非常高效, 当系统发生故障导致数据库重启时, MySQL 通过Redo log  来恢复为写入磁盘的数据库修改,重新执行这些操作,将数据持久化到磁盘,这样就保证了事务的持久性。

  • 一致性 : 指的是事务开始之前和事务结束只有,数据不会被破坏,假如A账户给B账户转账100元,无论成功与否,A和B的总金额是不发生改变的

InnoDB 引擎通过什么技术来保证事务的这四个特性的呢?

  • 持久性是通过 redo log (重做日志)来保证的;
  • 原子性是通过 undo log(回滚日志) 来保证的;
  • 隔离性是通过 MVCC(多版本并发控制) 或锁机制来保证的;
  • 一致性则是通过持久性+原子性+隔离性来保证;

只有保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。也就是说 A、I、D 是手段,C 是目的!

四 . 并发事务可能产生的问题

  • 脏读问题

当事务 A 在对数据进行修改的过程中, 事务 B 对同一个数据进行 了读取,此时 B 的读操作就叫做脏读,读取到的数据也被称之为脏数据 。

  • 幻读问题

在同一组数据当中,事务 A 进行查询数据 , 事务 B 进行 插入新的数据,导致事务 A 再次进行相同的查询时,查询到的数据行数发生了改变,这种情况称之为幻读,幻读的解决方案一般为加间隙锁。

  • 不可重复读问题

在同一组数据中,事务 A  进行查询数据, 事务B进行修改数据,导致事务A 重新执行相同的查询时,查询到的内容发生了改变,这种情况就称之为不可重复读,不可重复读的解决方案为加行锁或者表锁。

在这其中,不可重复读和幻读都是并发事务当中容易出现的问题,但是幻读主要涉及的是数据的插入,而不可重复读涉及的是数据的修改和更新,幻读的结果是前后读取的数据的数量不一致,而不可重复读是前后读取到的数据的内容不一致。

其中严重性 : 脏读  > 不可重复读 > 幻读

五 . 数据库的隔离级别

为了规避以上的三种并发事务中可能遇到的问题,MySQL 中提供了四种隔离级别来解决上述的并发事务问题,隔离级别越高,执行效率越低。

  1.  读未提交 :一个事务未提交时,但是他所做的变更就能够被其他事务所看到,即读未提交
  2.  读已提交:  一个事务提交之后,它所做的变更才能够被其他事务所看到,解决了脏读的问题
  3. 可重复读:同一个事务中,多次读取一个事务,获取到的结果是一致的, MySQL 的InnoDB引擎的默认隔离级别就是可重复读,但是没有解决幻读的问题。
  4. 串行化 :串行化会给记录加上读写锁,如果发生了读写冲突时,后访问的事务必须等待前一个事务执行完成,才能继续执行。

所以四种隔离级别的等级高低的排列如下 : 串行化  > 可重复读 > 读已提交 > 读未提交 ,隔离级别越低,事务请求的锁越InnoDB 存储引擎默认使用 可重复读

 MySQL 的隔离级别基于锁和 MVCC 机制共同实现的

  •  设置并查看当前事务的隔离级别
-- 查看当前会话隔离级别
SELECT @@tx_isolation;
-- 查看系统当前隔离级别
SELECT @@ global.tx_isplation
-- 设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
-- 设置系统当前隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL [设置你想设置的级别]
  • MVCC 

     在MySQL InnoDB引擎层⾯,⼜有新的解决⽅案(解决加锁后读写性能问题),叫MVCC(Multi Version Concurrency Control)  多版本并发控制,它主要基于创建和维护数据的多个版本(或快照),以允许事务之间的并发执行而不会产生冲突。

对于InnoDB引擎,默认情况下会启用MVCC来处理并发事务。这意味着在没有显式设置的情况下,InnoDB引擎会使用MVCC机制来提供并发控制和事务隔离性。可以通过创建和管理数据的多个版本来实现。

     在传统的锁定并发控制机制中,读操作和写操作之间会相互阻塞,因为写操作可能会改变数据,导致读操作的结果不一致。而MVCC通过创建数据的多个版本来解决这个问题。每个事务在开始时会创建一个一致性的数据库快照,然后在执行期间,事务只能看到在其开始之前已经存在的数据版本。这样,读操作可以并发地进行,而不会受到其他事务的写操作的影响 , 后续我们会对 MVCC 实现原理和锁机制进行详细的讲解说明 .


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

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

相关文章

使用 RLHF 训练 LLaMA 的实践指南:StackLLaMA

由于LLaMA没有使用RLHF,后来有一个初创公司 Nebuly AI使用LangChain agent生成的数据集对LLaMA模型使用了RLHF进行学习,得到了ChatLLaMA模型,详情请参考:Meta开源的LLaMA性能真如论文所述吗?如果增加RLHF,效…

Xcode14.3升级完项目无法运行

升级到14.3在真机上运行报错如下: /XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a 解决方法: 在Podfile中的最后一个end出添加下面代码 post_install do |installer| installer.generated_projects.each do |project| project.targets.each do |target| targ…

chatgpt赋能Python-python_nums

Python NumPy:大数据分析的神奇武器 Python NumPy是一种用于处理大型数据集的Python库。NumPy提供了一个矩阵数据结构,用于在Python中进行数学运算和数据分析。在本文中,我们将介绍NumPy的基本功能,以及它如何在数据科学领域中提…

KDZK-F励磁综合特性测试仪

一、产品概述 KDZK-F励磁综合特性测试仪是判断发电机转子绕组有无匝间短路的专用仪器,可以自动、手动(单向或双向)测量转子绕组的电压、电流、阻抗、功率、相位角等参数。 二、功能与特点 旋转鼠标,操作更方便。 可选择快速的自…

MySQL数据库最常见的6种故障的排除方法

MySQL数据库最常见的6中故障的排除方法 1.MySQL无法启动 2.MySQL连接不上 3.MySQL打开文件失败 4.MySQL挂起(hung) 5.MySQL崩溃(crash) 6.忘记用户密码 1.MySQL无法启动 1.无法访问系统资源 2.参数设置错误 无法访问系统…

【国产虚拟仪器】基于Zynq的雷达10Gbps高速PCIE数据采集卡方案(三)软件设计

4.1 引言 本章基于第二章的分析结论,进行系统软件设计。软件设计包括逻辑设计、嵌入 式软件设计和上位机软件设计。在逻辑设计中,对 ADC 模块、 Aurora 模块、 DDR3 SDRAM 模块和 PCIE 模块进行分析和设计,在 Vivado 软件提供的 …

静态时序分析-配置STA环境

1.什么是STA环境 DUA(待分析设计)会与其它同步设计交互,例如DUA从触发器接收数据,并将数据输出到DUA外部的另一个触发器。为了对这种设计执行STA,需要指定触发器的时钟、以及进入设计和退出设计的所有路径的时序约束。 2.时钟配置 定义时钟 定义时钟需要: 时钟源周期占…

SSRS rdlc报表 三 去除打印空白页

开发环境:vs2022 当我们新建一个报表,选择使用A4纸进行打印,有的时候打印列数过多,列会跑到下一页,调整好列显示后,所有的列都显示到一张纸上了,但是打印的时候发现,第二页是一张空…

宣传单页二维码怎么做?分享在线二维码制作小技巧

宣传单页现在也不是像之前的那种单一海报、纸质形式了。很多商家会将宣传单页做成二维码的形式,不仅传播方便,还方便用户填写信息便于统计。但是这种宣传单页二维码图片是怎么制作的呢? 一、什么工具能够制作二维码? 机智熊二维码…

为什么我在领英上搜到的客户都是显示领英会员(Linkedin Member)?

LinkedIn领英上找客户,开发客户已经越来越成为主流,但是很多刚注册使用LinkedIn领英的人会摸不着头脑,束手无策。 因为他会发现自己搜索出来的结果,找出来的客户都是显示领英会员(Linkedin Member)&#x…

数据结构与算法(六)

#数据结构 基础知识 数据结构:相互之间存在的一种多种的特定关系的数据元素的集合 逻辑结构: 线性表:最基本最简单的一种数据结构,一对一逻辑关系。 集合结构、线性结构、树形结构、图形结构 物理结构:顺序存储、链式存储 逻…

MYSQL 自定义变量用法收录

用户自定义变量使用&#xff1a; 优化排名语句 通过变量复制&#xff0c;快速实现类似行号功能 SET rownum :0 ; SELECT school_id , school_name , rownum :rownum1 AS rownum FROM base_school WHERE school_id<0 LIMIT 10 ; -- sql 排名 SET currcnt :0 ,pre…

如何在商场内进行导航?商场路线指引图怎么做?

如何在商场内进行导航&#xff1f;购物中心是多种零售店铺、服务设施集中在一个建筑物内或一个区域内&#xff0c;向消费者提供综合性服务的商业集合体。现在的购物中心面积都比较大&#xff0c;很多朋友的方向感明明不差&#xff0c;却每次都在商场遭遇“滑铁卢”&#xff0c;…

MaxCompute 发布智能物化视图,CU 算力节省 14%

作者&#xff1a;夏俊伟&#xff08;阿里云高级产品专家&#xff09;、郑君正&#xff08;阿里云高级技术专家&#xff09; 什么是物化视图 MaxCompute 物化视图是一种预先计算和存储结果数据的数据对象&#xff0c;也可以称之为“实体化视图”。物化视图可以作为一张虚拟表存…

输电线路测温工作要求

输电线路导线温度监测系统 一、产品描述&#xff1a; 在我国当前发展趋势下&#xff0c;电力的使用越来越庞大&#xff0c;对于供电系统的稳定性可靠性的考验越发严峻&#xff0c;智能化管理的推进必不可少&#xff0c;输电线路导线温度监测系统作为我司在线监测数据类产品&…

开源赋能 普惠未来|XuperCore诚邀您参与2023开放原子全球开源峰会

XuperCore&#xff08;待更名&#xff09;是百度自主研发&#xff0c;拥有完整知识产权的区块链底层技术XuperChain的内核&#xff0c;拥有620多篇区块链核心技术专利&#xff0c;以“高性能”、“开源”为主要设计目标&#xff0c;致力于创建“更快、更通用、更好用”的区块链…

JavaEE(系列13) -- 多线程(CAS)

目录 1. 什么是 CAS 2. CAS伪代码 3. CAS 的应用 3.1 实现原子类 3.2 实现自旋锁 4. CAS的ABA问题(面试常问) 4.1 ABA 问题 4.2 ABA问题解决方案 1. 什么是 CAS CAS: 全称Compare and swap&#xff0c;字面意思:”比较并交换“. 一个 CAS 涉及到以下操作&#xff1a; 我们假…

速卖通、阿里国际、shopee618盛典!提升订单销量的秘密武器—测评补单技术!

随着电子商务的迅速发展&#xff0c;网络购物已成为现代人生活中不可或缺的一部分。而在众多购物平台中&#xff0c;速卖通凭借其丰富多样的商品选择和优惠的价格政策&#xff0c;成为了全球消费者的首选之一。尤其是每年的618盛典&#xff0c;更是吸引了大量消费者的目光。然而…

【CH32】| 01——新建工程 | 下载 | 运行 |调试

系列文章目录 【CH32】| 00——开发环境搭建 【CH32】| 01——新建工程 | 下载 | 运行 |调试 失败了也挺可爱&#xff0c;成功了就超帅。 文章目录 1. 新建工程1.1 基于官方IDE [MounRiver Studio]1.1.1 使用官方内置的工程模板新建1.1.2 使用自定义工程模板新建1.1.2.1 新建自…

会声会影2023最新版本剪辑视频的方法和步骤

想要学剪辑&#xff0c;剪辑软件是基础。如果大家是零基础的话&#xff0c;建议大家选择一款入门级的剪辑软件&#xff0c;比如说会声会影。这款软件功能强大、操作简单&#xff0c;而且会声会影中文网站首页有很多剪辑教程供大家学习参考。会声会影在用户的陪伴下走过23余载&a…