MySQL事务管理(二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL事务管理

五、事务的隔离级别

MySQL服务可能同时被多个客户端进程(线程)访问,访问的方式以事务的方式进行

一个事务可能由多条SQL语句构成,也意味着任何一个事务,都有执行前、执行中和执行后三个阶段,而所谓的原子性就是让用户层要么看到执行前,要么看到执行后,执行中若出现问题,可以随时回滚,所以单个事务对用户表现出来的特性就是原子性

但毕竟每个事务都有一个执行的过程,在多个事务各自执行自己的多条SQL时,仍然可能会出现互相影响的情况,如多个事务同时访问同一张表,甚至是表中的同一条记录

数据库为了保证事务执行过程中尽量不受干扰,于是出现了隔离性的概念,而数据库为了允许事务在执行过程中受到不同程度的干扰,于是出现了隔离级别的概念

数据库事务的隔离级别:


读未提交(Read Uncommitted): 在该隔离级别下,所有的事务都可以看到其他事务没有提交的执行结果,实际生产中不可能使用这种隔离级别,因为这种隔离级别相当于没有任何隔离性,会存在很多并发问题,如脏读、幻读、不可重复读等

读提交(Read Committed): 该隔离级别是大多数数据库的默认隔离级别,但并不是MySQL默认的隔离级别,其满足了隔离的简单定义:一个事务只能看到其他已经提交的事务所做的改变,但这种隔离级别存在不可重复读和幻读的问题

可重复读(Repeatable Read): MySQL默认的隔离级别,该隔离级别确保同一个事务在执行过程中,多次读取操作数据时会看到同样的数据,即解决了不可重复读的问题,但这种隔离级别下仍然存在幻读的问题

串行化(Serializable): 事务的最高隔离级别,该隔离级别通过强制事务排序,使之不可能相互冲突,从而解决了幻读问题。在每个读的数据行上面加上共享锁,但是可能会导致超时和锁竞争问题,这种隔离级别太极端,实际生产中基本不使用

注意:


虽然数据库事务的隔离级别有以上四种,但一个稳态的数据库只会选择这其中的一种,作为默认隔离级别。但数据库默认的隔离级别有时可能并不满足上层的业务需求,因此数据库提供了这四种隔离级别,可以自行设置

隔离级别基本上都是通过加锁的方式实现的,不同的隔离级别对锁的使用是不同的,常见的有表锁、行锁、写锁、间隙锁(GAP)、Next-Key锁(GAP+行锁)等

5.1 查看与设置隔离级别

查看全局隔离级别


select @@global.tx_isolation

8e5e800ee7e44f6d870a35ef6dd8532b.png


查看会话隔离级别


通过下面两种方式都可以查看当前会话下的隔离级别

select @@session.tx_isolation;
select @@tx_isolation;


cb800d62d6bf4450aa7555ca96d402c6.png

设置会话隔离级别


set session transaction isolation level 隔离级别

410e89bcbad74c5c8b0bfcf3df11df9d.png


注意:设置会话隔离级别只影响当前会话,新起的会话依旧采用全局隔离级别


设置全局隔离级别


set global transaction isolation level 隔离级别

253d132b8deb4b668f5edc2c44c8f77f.png


注意:设置全局隔离级别会影响后续的新会话,但当前会话隔离级别不会发生变化,若要让当前会话的隔离级别也改变,则需设置会话隔离级别或重启会话


5.2 读未提交(Read Uncommitted)

启动两个终端,将隔离级别都设置为读未提交,并查看此时银行用户表中的数据


281a54d770534672bae40de0498c55f6.png


在两个终端各自启动一个事务,左终端的事务所作的修改在没有提交之前,右终端中的事务就能够看到了

6d86974076184fbfa1496e91a1b92432.png



读未提交是事务的最低隔离级别,几乎没有加锁,虽然效率高,但是问题比较多,所以严重不建议使用

一个事务在执行中,读到另一个执行中事务的更新(或其他操作)但是未commit的数据,这种现象叫做脏读

5.3 读提交(Read Committed)

启动两个终端,将隔离级别都设置为读提交,并查看此时银行用户表中的数据


82685380e10247f4a3041302f6bb617b.png


两个终端各自启动一个事务,左终端的事务所作的修改在没有提交之前,右终端的事务无法看到

084ffe4d67754c678632d05c6a98bbfc.png



只有左终端的事务提交后,右终端的事务才能看到修改后的数据


bf49a6833e1f4443a2d940960d8e8bd6.png


注意:一个事务在执行过程中,两个相同的select查询得到了不同的数据,这种现象被称为不可重复读


5.4 可重复读(Repeatable Read)

启动两个终端,将隔离级别都设置为可重复读,并查看此时银行用户表中的数据

fbce3552d4e2402dace73299ba096650.png



在两个终端各自启动一个事务,左终端中的事务所作的修改在没有提交之前,右终端中的事务无法看到


5dcc64869f3843558d435dfa41fb2cfa.png


并且当左终端中的事务提交后,右终端中的事务仍然看不到修改后的数据


0276a7ba35f04cb9aa1e3d3239f54588.png


只有当右终端的事务提交后再查看表中的数据,这时才能看到修改后的数据

c38bdb6afda643eebc3db4d287e20757.png



在可重复读隔离级别下,一个事务在执行过程中,相同的select查询得到的是相同的数据,即可重复读

一般的数据库在可重复读隔离级别下,update数据是满足可重复读的,但insert数据会存在幻读问题,因为隔离性是通过对数据加锁完成的,而新插入的数据原本是不存在的,因此一般的加锁无法屏蔽这类问题

一个事务在执行过程中,相同的select查询得到了新的数据,如同出现了幻觉,这种现象被称为幻读

MySQL解决了可重复读隔离级别下的幻读问题【MySQL通过Next-Key锁(GAP+行锁)来解决幻读问题】,如重新在这两个终端各自启动一个事务,左终端中的事务向表中插入数据的在没有提交前,右终端中的事务无法看到

3e2f533a4b2d49608eaef4afbe987499.png



当左终端中的事务提交后,右终端中的事务仍然看不到新插入的数据

7eb667e40deb43e697a0b5cea250b5f2.png



只有当右终端的事务提交后再查看表中的数据,此时才能看到新插入的数据


29c92354388c4a6a99f4955ef0b64c4a.png


5.5 串行化

启动两个终端,将隔离级别都设置为串行化,并查看此时银行用户表中的数据


3779f609189d4913bcb7de6a774dd318.png


在两个终端各自启动一个事务,若两个事务都对表进行的是读操作,那么这两个事务可以并发执行,不会被阻塞

361f3236886c458c98a6c031c504fe06.png



但若这两个事务中有一个事务要对表进行写操作,那么这个事务就会立即被阻塞


1d42c97501cd43c19b62f69381ca02f1.png


直到访问这张表的其他事务都提交后,这个被阻塞的事务才会被唤醒,然后才能对表进行修改操作


c66687d15e8d44ecb915332c329aec7b.png


串行化是事务的最高隔离级别,多个事务同时进行读操作时加的是共享锁,因此可以并发执行读操作,但一旦需要进行写操作,就会进行串行化,效率低,几乎不会使用

5.6 隔离级别总结

MySQL中隔离级别:


5a0f1f3cd71e40c78ae80895591ee6d3.png


隔离级别越严格,安全性越高,但数据库的并发性能也就越低,在选择隔离级别时需在两者之间找一个平衡点

表中只写出了各种隔离级别下进行读操作时是否需要加锁,因为无论哪种隔离级别,只要需进行写操作就一定要加锁


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6天前
|
监控 关系型数据库 MySQL
《MySQL 简易速速上手小册》第8章:事务管理和锁定策略(2024 最新版)
《MySQL 简易速速上手小册》第8章:事务管理和锁定策略(2024 最新版)
34 1
|
6天前
|
SQL 关系型数据库 MySQL
【MySQL】15. 事务管理(重点) -- 1
【MySQL】15. 事务管理(重点) -- 1
18 0
|
6天前
|
SQL 关系型数据库 MySQL
【MySQL】16.事务管理(重点) -- 2
【MySQL】16.事务管理(重点) -- 2
20 0
|
7月前
|
SQL 关系型数据库 MySQL
MySQL操作之事务管理
MySQL操作之事务管理
33 0
|
6天前
|
关系型数据库 MySQL 数据库
【MySQL】:数据库事务管理
【MySQL】:数据库事务管理
27 0
|
6天前
|
缓存 关系型数据库 MySQL
【专栏】提升MySQL性能和高可用性的策略,包括索引优化、查询优化和事务管理
【4月更文挑战第27天】本文探讨了提升MySQL性能和高可用性的策略,包括索引优化、查询优化和事务管理。通过合理使用B-Tree和哈希索引,避免过度索引,以及优化查询语句和利用查询缓存,可以改善性能。事务管理中,应减小事务大小并及时提交,以保持系统效率。主从或双主复制可增强高可用性。综合运用这些方法,并根据实际需求调整,是优化MySQL的关键。
|
6天前
|
关系型数据库 MySQL 测试技术
【MySQL】16. 事务管理( 重点 | 选学 ) -- 3
【MySQL】16. 事务管理( 重点 | 选学 ) -- 3
26 0
|
10月前
|
存储 SQL 关系型数据库
MySQL事务管理(三)
MySQL事务管理
72 0
|
10月前
|
SQL 存储 关系型数据库
MySQL事务管理(一)
MySQL事务管理
79 0
|
关系型数据库 MySQL Java
Spring事务管理--(一)数据库事务隔离级别与mysql引擎基础讲解
一、前言 本篇文章来自网络整理,很简单,但是很实用对于初级和中级工程师。 原创地址1:http://www.
1349 0