MySQL(四)事务原理及分析

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL(四)事务原理及分析



前言

背景:之前提到MySQL可以并发操作,即多个MySQL客户端操作一个服务端中的数据库,因此涉及到并发访问的问题,所以就有事务的概念。


定义:事务的本质是并发控制的单元,是用户定义一系列数据库操作的集合。这些操作要么都做,要么都不做,是一个不可分割的工作单位。


组成:事务可由一条非常简单的 SQL 语句组成,也可以由一组复杂的 SQL 语句组成;MySQL innodb 下,单条语句都具备事务;可以通过 autocommit = 0; 设置当前会话手动提交;

事务具有ACID特性,即原子性、一致性、隔离性和持久性。

ACID特性

原子性(A)

事务操作要么都做(提交),要么都不做(回滚);事务是访问并更新数据库各种数据项的一个程序执行单元,是不可分割的工作单位;通过 undolog 来实现回滚操作。undolog 记录的是事务每步具体操作,当回滚时,回放事务具体操作的逆运算;

事务包含的全部操作是一个不可分割的整体,要么全部执行,要么全部不执行;

虽然说事务要保持原子性,例如完整的串行执行就可以保证事务中指令执行的原子性;但是这种方式的性能是非常低的,因此Mysql通常会通过事务与事务之间指令的交叉执行来提高性能。

隔离性(I)

描述:各个事务之间互相影响的程度;防止多个并发事务交叉执行导致的数据不一致,通过锁和MVCC实现。

目的:主要规定多个事务访问同一数据资源,各个事务对该数据资源访问的行为,不同的隔离性是应对不同的现象(脏读、不可重复读、幻读)

事务的隔离性要求每个读写事务的对象对其他事务的操作对象能相互分离,并发事务之间不会相互影响,设定了不同程度的隔离级别,通过适度破环一致性,得以提高性能;通过 MVCC 和 锁来实现;MVCC 是多版本并发控制,主要解决一致性非锁定读,通过记录和获取行版本,而不是使用锁来限制读操作,从而实现高效并发读性能。锁用来处理并发 DML 操作;数据库中提供粒度锁的策略,针对表(聚集索引 B+ 树)、页(聚集索引 B+ 树叶子节点)、行(叶子节点当中某一段记录行)三种粒度加锁;

持久性(D)

事务一旦完成,要将数据所做的变更记录下来,包括数据存储和多副本的网络备份;

事务提交后,事务 增删改操作将会持久化(写入 redolog 磁盘文件 哪一个页 页偏移值 具体数据);即使发生宕机等故障,数据库也能将数据恢复。redolog 记录的是物理日志;

一致性(C)

事务的前后,所有的数据都保持一个一致的状态,不能违反数据的一致性检测(完整性约束检查);

一致性指事务将数据库从一种一致性状态转变为下一种一致性的状态,在事务执行前后,数据库完整性约束没有被破坏;一个事务单元需要提交之后才会被其他事务可见。例如:一个表的姓名是唯一键,如果一个事务对姓名进行修改,但是在事务提交或事务回滚后,表中的姓名变得不唯一了,这样就破坏了一致性;一致性由原子性、隔离性以及持久性共同来维护的。

隔离级别

在多个事务并发执行时,需要考虑隔离级别,即不同的隔离性。ISO 和 ANIS SQL 标准制定了四种事务隔离级别的标准,隔离级别越高,性能越低

READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE前三种的隔离级别会导致不同的并发读异常,即脏读、不可重复读、幻读场景。


不同的隔离级别产生的不同的并发读异常情况:

脏读:一个事务读到另一个未提交事务修改的数据;

不可重复读:一个事务两次读取同一个数据不一样;

幻读:一个事务内两次读到同一范围内的记录得到的结果集不一样;

区别

脏读和不可重复读的区别在于,脏读是读取了另一个事务未提交的数据,而不可重复读是读取了另一个事务提交之后的修改;本质上都是其他事务的修改影响了本事务的读取;

不可重复读和幻读比较类似;不可重复读是两次读取同一条记录,得到不一样的结果;而幻读是两次读取同一个范围内的记录得到的结果集不一样(可能不同个数,也可能相同个数内容不一样,比如x一行后又添加新行);不可重复读是因为其他事务进行了 update 操作,幻读是因为其他事务进行了 insert或者 delete 操作。


MySQL innodb默认支持的隔离级别是 REPEATABLE READ;

READ UNCOMMITTED

读未提交;该级别下读操作不加锁,写操作加排他锁,写锁在事务提交或回滚后释放锁;所以可能会读到事务回滚前的数据,会产生脏读。

READ COMMITTED

读已提交(RC);该隔离级别下读取历史版本的最新数据,所以读取的是已提交的数据;会产生不可重复读的现象。

REPEATABLE READ

可重复读(RR);此时读取操作读取事务开始时的版本数据;会产生幻读的现象。可以用当前读,即给读加锁来解决幻读现象。

SERIALIZABLE

可串行化;该级别下给读加了共享锁;所以事务都是串行化的执行;此时隔离级别最严苛;

共享锁&排他锁

为了解决并发读异常问题,数据库引入了锁机制。锁分为共享锁和排他锁,共享锁允许多个事务同时读取同一份数据,但不能进行修改;排他锁则只允许一个事务修改数据。

MVCC

MVCC是一种多版本并发控制技术,可以通过不加锁的情况下用于解决并发读异常和幻读问题。MVCC通过为每个事务创建一个独立的版本来实现隔离性,每个版本都包含该事务执行时所见到的所有数据。当多个事务同时访问同一份数据时,系统会根据每个事务的版本号来判断是否允许访问。

多版本主要依赖Undo-log日志来实现,而并发控制则通过表的隐藏字段+ReadView快照来实现

详细内容参考:https://maimai.cn/article/detail?fid=1760762705&efid=UVf-Pw63L4lRkESvTUv1AQ

read view

在 read committed 和 read repeatable 隔离级别下,MVCC 采用 read view 来实现的,它们的区别在于创建 read view 时机不同:

read committed 隔离级别会在事务中每个 select 都会生成一个新的 read view,也意味着在同一个事务多次读取同一条数据可能出现数据不一致;存在不可重复读情况。因为在多次读取期间可能有其他事务修改了该条记录,并提交了;

read repeatable 隔离级别是启动事务时生成一个 read view,在整个事务读取数据才使用这个 read view,这样保证了在事务期间读到的数据都是事务启动前的记录,解决了不可重复读。

redo

redo 日志用来实现事务的持久性;内存中包含 redo log buffer,磁盘中包含 redo log file;

当事务提交时,必须先将该事务的所有日志写入到重做日志文件进行持久化,待事务的commit 操作完成才完成了事务的提交;

redo log 顺序写,记录的是对每个页的修改(页、页偏移量、以及修改的内容);在数据库运行时不需要对 redo log 的文件进行读取操作;只有发生宕机的时候,才会拿redo log 进行恢复;

undo

undo 日志用来帮助事务回滚以及 MVCC 的功能;存储在共享表空间中;undo 是逻辑日志,回滚时将数据库逻辑地恢复到原来的样子,根据 undo log 的记录,做之前的逆运算;比如事务中有 insert 操作,那么执行 delete 操作;对于 update 操作执行相反的 update 操作;

同时 undo 日志记录行的版本信息,用于处理 MVCC 功能;

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
1月前
|
存储 消息中间件 监控
MySQL 到 ClickHouse 明细分析链路改造:数据校验、补偿与延迟治理
蒋星熠Jaxonic,数据领域技术深耕者。擅长MySQL到ClickHouse链路改造,精通实时同步、数据校验与延迟治理,致力于构建高性能、高一致性的数据架构体系。
MySQL 到 ClickHouse 明细分析链路改造:数据校验、补偿与延迟治理
|
2月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
126 3
|
2月前
|
SQL 关系型数据库 MySQL
MySQL锁机制:并发控制与事务隔离
本文深入解析了MySQL的锁机制与事务隔离级别,涵盖锁类型、兼容性、死锁处理及性能优化策略,助你掌握高并发场景下的数据库并发控制核心技巧。
|
1月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
320 6
|
1月前
|
关系型数据库 MySQL 数据库
【赵渝强老师】MySQL的事务隔离级别
数据库并发访问时易引发数据不一致问题。如客户端读取到未提交的事务数据,可能导致“脏读”。MySQL通过四种事务隔离级别(读未提交、读已提交、可重复读、可序列化)控制并发行为,默认为“可重复读”,以平衡性能与数据一致性。
222 0
|
2月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
209 6
|
2月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
140 1
|
3月前
|
存储 关系型数据库 MySQL
深入理解MySQL索引类型及其应用场景分析。
通过以上介绍可以看出各类MySQL指标各自拥有明显利弊与最佳实践情墁,在实际业务处理过程中选择正确型号极其重要以确保系统运作流畅而稳健。
187 12
|
2月前
|
关系型数据库 MySQL 数据库
MySql事务以及事务的四大特性
事务是数据库操作的基本单元,具有ACID四大特性:原子性、一致性、隔离性、持久性。它确保数据的正确性与完整性。并发事务可能引发脏读、不可重复读、幻读等问题,数据库通过不同隔离级别(如读未提交、读已提交、可重复读、串行化)加以解决。MySQL默认使用可重复读级别。高隔离级别虽能更好处理并发问题,但会降低性能。
124 0
|
2月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。

推荐镜像

更多