Mysql原理与调优-事务与MVCC

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【8月更文挑战第19天】

1.事务

1.1 什么是事务

1.2 事务隔离级别

1.2.1 事务并发执行可能出现的问题

1.2.2 隔离级别

1.2.3 如何查看和设置事务的隔离级别

1.2.3 快照读和当前读

2.MVCC

2.1 版本链机制

2.2 Read View

2.2.1 Read View读取事务的原则

2.4 Read Committed级别查询

2.5 Repeatable Read级别查询

2.6 MVCC是否能解决幻读问题

1.事务
1.1 什么是事务
事务其实就是对Mysql的一系列操作,它要求满足4个性质,分别是A(原子性)、C(一致性)、I(隔离性)、D(持久性)。接下来我们来分别介绍一下这4个性质的含义。

原子性
原子性,表示对于事务里面的操作是一个整体,要么同时成功,要么同时失败。比如A给B转账,A减少50,B加50,这一操作是一个整体。由redo log和undo log共同保证。

持久性
持久性,表示的事务一旦提交,便会持久化到磁盘中。这一操作由redo log保证。

隔离性
隔离性,表示不同的事务之间是不相互影响的。快照读和写操作的隔离性由MVCC保证,当前读和的写操作,写操作和写操作的隔离性由Mysql的锁机制保证。

一致性
一致性,一致性分为数据一致性和约束一致性。我的立即其实就是符合客观事实,比如A给B转账,A减少50,B加50,但是总的金额是未改变的,这是否符合客观事实的。只有满足原子性、持久、隔离性才能保证一致性。

1.2 事务隔离级别
1.2.1 事务并发执行可能出现的问题
假设的现在有两个事务,事务A和事务B并发操作。

脏写
脏写,事务A更改了事务B的还未提交的数据。

脏读
脏读,事务A读取到事务B还未提交的数据。

不可重复读
不可重复读,在同一个事务A里面,同时读取某行数据,前后值不一样。原因是,在此过程中,事务B对该行数据进行修改,并且提交。

幻读
幻读,在同一个事务A里面,同时读取某个范围的数据,前后行数不一样。原因是,在此过程中,事务B插入了记录,并且提交。

1.2.2 隔离级别
Mysql的隔离级别,分为4个,读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED),可重复读(REPEATABLE READ)、串行化(SERIALIZABLE)。

注意:对于Mysql而言,RR级别,也可以解决,快照读的幻读问题。

1.2.3 如何查看和设置事务的隔离级别
SHOW VARIABLES LIKE 'transaction_isolation'; //查看事务隔离级别
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; //设置事务个几把
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;//设置当前会话的事务隔离级别
1.2.3 快照读和当前读
前面说过,事务的隔离性,主要是通过,MVCC和加锁来保证的。那什么时候是采用MVCC机制,设么时候采用加锁呢?就需要了解快照度和当前读的概念。

当前读:要求读取到的一定是当前数据库里面最新的内容,如果结合CAP理论来看,其实就是保证一致性。在Mysql里面,通过select from table lock in share mode 或者 select from table for update这两种查询为当前读。

快照读: 读取的是读请求时的快照数据,在读操作者一过程中,其他事务可能对改数据进行修改,所以读取到的可能是老数据,如果结合CAP理论来看,其实就是保证可用性。在Mysql里面,通过普通的select就是快照读。

快照读在mysql中的对于隔离级别的处理,其实是相当于DML操作的。所以快照读和DML操作采用MVCC来保证隔离性。当前读和DML采用加锁来保证隔离性。

2.MVCC
2.1 版本链机制
前面讲Mysql行记录的时候,曾经说过,每条记录的会有三个隐藏列,分别是row_id,tx_id,roll_pointer。每次更新,都会在undo log里面放一条旧的数据,通过roll_pointer连接成一个版本链。其中tx_id是一个递增的。

2.2 Read View
MVCC主要是保证快照读和DML语句的隔离性。它每次读取主要读取到的其实是发送select命令时的快照。所以MVCC在每次读取的时候,会生成一个Read View,里面主要包含3个部分:

字段 说明
m_ids 所有活跃的事务id
min_trx_id 活跃的事务最小id
max_trx_id 活跃的事务最大id加1
creator_trx_id 创建的当前快照的事务id
2.2.1 Read View读取事务的原则
假设当前需要被读取事务的tx_id为data_tx_id。

1.如果data_tx_id小于Read view的活跃事务最小id,表示修改这条记录的事务已经提交,可以读取。

2.如果data_tx_id等于Read view的creator_trx_id,表示这条数据是生成Read View的事务创建的,能够读取,所以在同一个事务里面,后面的select能够读取到该事务前面创建的数据。

3.如果data_tx_id大于等于活跃的事务最大id加1,表示在创建这个Read View的时候,该事务还未到达,所以不能提交。

4.如果data_tx_id在该Read View的m_ids里面,便表示生产该Read View的时候,修改data的事务还未提交,不能被访问。

综上,通过Read View机制,每个事务只能读取到当前事务修改的数据或者在当前select请求到达前并且事务已经提交的修改的数据。

2.4 Read Committed级别查询
原则:Read Committed每次查询都会生成一个Read View。因为,通过Read View每个事务只能读取到当前事务修改的数据或者在当前select请求到达前并且事务已经提交的修改的数据。所以的Read View一定读取到的是已经提交过后的事务,满足读已提交。

但是,因为在这个隔离级别下,每次读取会生成一个Read View,比如上面这个例子。

1.事务A在第一次select的时候,此时事务B还为提交,所以当前活跃事务id为[8,9],所以select到的内容为A。

2.在中间事务B更新数据为B并且提交。

3.事务A再次select,会为此生成一个新的Read View,里面m_ids为[8],表示只有A事务还在活跃,此时就能读取的内容为B。

可以看出,这种情况下,读取到的永远是已经提交的事务修改的数据,但是可能会出现不可重复读的问题。

2.5 Repeatable Read级别查询
原则:Read Committed只有在第一次查询的时候会生产一个Read View,后面都会共用这个Read View。所以在查询过程中,不管中途是否有其他事务修改数据并且修改,只要事务id比生产Read View的事务id大,便不能读取。

对于上面这个例子:

1.事务A在第一次select的时候,此时事务B还为提交,所以当前活跃事务id为[8,9],所以select到的内容为A。

2.在中间事务B更新数据为B并且提交。

3.事务A再次select,Read View不变,里面m_ids为[8,9],此时就能读取的内容为A。

可以看出,在这种情况下,只会共用一次Read View。所以在Repeatable Read级别下,只能读取事务id小于等于生成Read View的事务id的事务修改或者插入的数据。能够解决不可重复读问题。

2.6 MVCC是否能解决幻读问题
在Repeatable Read情况下,MVCC在多次查询,会共用一个Read View,所以在此情况下,MVCC只能读取到事务id等于生成Read View的事务id的事务修改或者插入的数据。由此可以看出,MVCC也能解决幻读问题,但是有种特殊情况。

可以看出,在事务A读取的过程中,事务B插入一条数据后提交,事务A刚好去更新了这条数据,会更改修改该条数据的事务id为事务A的id,所以事务A再次读取能够读取到该数据,会出现幻读问题。这种情况,可以通过后面的加锁来解决。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
26天前
|
存储 关系型数据库 MySQL
MySQL MVCC全面解读:掌握并发控制的核心机制
【10月更文挑战第15天】 在数据库管理系统中,MySQL的InnoDB存储引擎采用了一种称为MVCC(Multi-Version Concurrency Control,多版本并发控制)的技术来处理事务的并发访问。MVCC不仅提高了数据库的并发性能,还保证了事务的隔离性。本文将深入探讨MySQL中的MVCC机制,为你在面试中遇到的相关问题提供全面的解答。
85 2
|
1月前
|
存储 SQL 关系型数据库
MySQL的事务隔离级别
【10月更文挑战第17天】MySQL的事务隔离级别
98 43
|
29天前
|
存储 关系型数据库 MySQL
MySQL主从复制原理和使用
本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
MySQL主从复制原理和使用
|
22天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
111 1
|
26天前
|
存储 关系型数据库 MySQL
MySQL MVCC深度解析:掌握并发控制的艺术
【10月更文挑战第23天】 在数据库领域,MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种重要的并发控制机制,它允许多个事务并发执行而不产生冲突。MySQL作为广泛使用的数据库系统,其InnoDB存储引擎就采用了MVCC来处理事务。本文将深入探讨MySQL中的MVCC机制,帮助你在面试中自信应对相关问题。
86 3
|
1月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1642 14
|
29天前
|
SQL 关系型数据库 MySQL
Mysql中搭建主从复制原理和配置
主从复制在数据库管理中广泛应用,主要优点包括提高性能、实现高可用性、数据备份及灾难恢复。通过读写分离、从服务器接管、实时备份和地理分布等机制,有效增强系统的稳定性和数据安全性。主从复制涉及I/O线程和SQL线程,前者负责日志传输,后者负责日志应用,确保数据同步。配置过程中需开启二进制日志、设置唯一服务器ID,并创建复制用户,通过CHANGE MASTER TO命令配置从服务器连接主服务器,实现数据同步。实验部分展示了如何在两台CentOS 7服务器上配置MySQL 5.7主从复制,包括关闭防火墙、配置静态IP、设置域名解析、配置主从服务器、启动复制及验证同步效果。
Mysql中搭建主从复制原理和配置
|
1月前
|
SQL 关系型数据库 MySQL
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
尼恩,一位40岁的资深架构师,通过其丰富的经验和深厚的技術功底,为众多读者提供了宝贵的面试指导和技术分享。在他的读者交流群中,许多小伙伴获得了来自一线互联网企业的面试机会,并成功应对了诸如事务ACID特性实现、MVCC等相关面试题。尼恩特别整理了这些常见面试题的系统化解答,形成了《MVCC 学习圣经:一次穿透MYSQL MVCC》PDF文档,旨在帮助大家在面试中展示出扎实的技术功底,提高面试成功率。此外,他还编写了《尼恩Java面试宝典》等资料,涵盖了大量面试题和答案,帮助读者全面提升技术面试的表现。这些资料不仅内容详实,而且持续更新,是求职者备战技术面试的宝贵资源。
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
|
23天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
53 0
|
13天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
28 1
下一篇
无影云桌面