【Hello mysql】 mysql的事务(下)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 【Hello mysql】 mysql的事务(下)

事务的隔离级别

如何理解隔离性(粗浅理解)

  • MySQL服务可能会同时被多个客户端进程(线程)访问,访问的方式以事务方式进行
  • 一个事务可能由多条SQL构成,也就意味着,任何一个事务,都有执行前,执行中,执行后的阶段。而所谓的原子性,其实就是让用户层,要么看到执行前,要么看到执行后。执行中出现问题,可以随时回滚。所以单个事务,对用户表现出来的特性,就是原子性。
  • 但毕竟所有事务都要有个执行过程,那么在多个事务各自执行多个SQL的时候,就还是有可能会出现互相影响的情况。比如:多个事务同时访问同一张表,甚至同一行数据。
  • 数据库中,为了保证事务执行过程中尽量不受干扰,就有了一个重要特征:隔离性
  • 数据库中,允许事务受不同程度的干扰,就有了一种重要特征:隔离级别

隔离级别

一共有四种隔离级别

  • 读未提交【Read Uncommitted】: 在该隔离级别,所有的事务都可以看到其他事务没有提交的执行结果。(实际生产中不可能使用这种隔离级别的),但是相当于没有任何隔离性,也会有很多并发问题,如脏读,幻读,不可重复读等,我们上面为了做实验方便,用的就是这个隔离性。
  • 读提交【Read Committed】 :该隔离级别是大多数数据库的默认的隔离级别(不是 MySQL 默认的)。它满足了隔离的简单定义:一个事务只能看到其他的已经提交的事务所做的改变。这种隔离级别会引起不可重复读,即一个事务执行时,如果多次 select, 可能得到不同的结果。
  • 可重复读【Repeatable Read】: 这是 MySQL 默认的隔离级别,它确保同一个事务,在执行中,多次读取操作数据时,会看到同样的数据行。但是会有幻读问题。(mysql中解决了这个问题)
  • 串行化【Serializable】: 这是事务的最高隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决了幻读的问题。它在每个读的数据行上面加上共享锁。但是可能会导致超时和锁竞争(这种隔离级别太极端,实际生产基本不使用)

为什么要有隔离级别

隔离级别实际上就是在效率和安全之间找到一个平衡点

而mysql之所以设置这么多隔离级别就是为了让用户有得选

脏读 幻读 不可重复读是什么意思

脏读: 一个事务在执行过程中读到了其他事务没有提交的数据

我们在上面的实验中肯定知道了一点 如果一个事务没有提交 那么它的数据是不一定会留下来的

那么我们读取了一个可能不会存在的数据 这肯定是一个问题

幻读: 一个事务在执行过程中读取了通过select读取了新的数据

一般来说我们加锁针对的是已存在的数据 所以说加锁之后 删改查 并不会有什么问题 但是对于不存在的数据我们无法加锁 也就是说我们无法保证是否有事务向数据库表中插入新的数据 如果说我们前后的select不一致(强调后面的select读取出了新的数据) 那么这个时候就是出现了幻读问题

mysql通过Next-Key锁(GAP+行锁)的形式解决了在可重复度隔离级别下的幻读问题

不可重复读: 一个事务在执行过程中多次读取的数据不一致的

这个问题主要出现在读提交隔离级别中 我们每次读取的时候都会受到别的事务提交数据的影响

查看和设置隔离级别

查看全局隔离级别

查看当前会话隔离级别

设置隔离级别

语法

--设置当前会话 or 全局隔离级别语法
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READCOMMITTED | REPEATABLE READ | SERIALIZABLE}

四种隔离级别详解

读 – 未提交

这是效率最高的一个隔离级别 也是安全性最差的一个隔离级别 平时我们不建议使用

下图两个客户端都被我们设置为了读–未提交隔离级别

之后我们让两个客户端同时查看一张表 一个客户端启动事务(不提交)向里面插入数据 一个客户端查看表

我们发现就算这个客户端没有提交数据 另外一个客户端还是能够看到数据 这个就是读未提交

读 - 提交

下图两个客户端都被我们设置为了读–提交隔离级别

之后我们左边客户端启动一个事务 并且插入一个数据之后 再使用右边的客户端查看数据 我们就会发现account数据表没有任何的变化

之后我们让右边的客户端开启一个事务 并且再次查询

之后左边commit 右边继续查询

我们发现当左边的客户端提交数据之后 右边再次查询读取了做百年新提交的数据 这也就造成了不可重复读的问题

可重复读

下面两个图中的客户端都被我们设置了可重复读隔离级别

之后我们同时启动两个事务

首先我们在右边的客户端中查询数据 之后让左边客户端插入数据之后提交 之后再次查看右边客户端的数据

我们发现此时右边客户端中的数据没有改变 还是一开始读取的那个 这就是可重复读

幻读问题

事实上我们刚刚的操作很可能会产生一个幻读问题 因为数据库只能对于存在的数据加锁 所以说插入的数据很可能会被再次select住

不过mysql通过Next-Key锁 (GAP+行锁)解决了这个问题 在使用其他数据库的时候我们仍然可能遇到

串行化

串行化是最安全 也是效率最低的一个模式

它直接暴力的将除了读以外的所有行为全部加锁 自然也就不会有安全上的问题了

这里就不作演示了

一致性的理解

一致性是由其他三个特性保证的 原因如下

  • 事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库只包含事务成功提交的结果时,数据库处于一致性状态。如果系统运行发生中断,某个事务尚未完成而被迫中断,而改未完成的事务对数据库所做的修改已被写入数据库,此时数据库就处于一种不正确(不一致)的状态。因此一致性是通过原子性来保证的。
  • 事务处理结束之后必须要保证数据的保存是永久的 所以说一致性是通过持久性保证的
  • 在多个事务并行的时候 不会由于交叉执行而导致数据不一致 所以说一致性是通过隔离性保证的
  • 此外一致性还和用户的业务逻辑强相关 如果说用户的业务逻辑不正确就不能保证一致性

总结

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
13天前
|
存储 SQL 关系型数据库
MySQL的事务隔离级别
【10月更文挑战第17天】MySQL的事务隔离级别
89 43
|
26天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1601 14
|
18天前
|
SQL 关系型数据库 MySQL
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
尼恩,一位40岁的资深架构师,通过其丰富的经验和深厚的技術功底,为众多读者提供了宝贵的面试指导和技术分享。在他的读者交流群中,许多小伙伴获得了来自一线互联网企业的面试机会,并成功应对了诸如事务ACID特性实现、MVCC等相关面试题。尼恩特别整理了这些常见面试题的系统化解答,形成了《MVCC 学习圣经:一次穿透MYSQL MVCC》PDF文档,旨在帮助大家在面试中展示出扎实的技术功底,提高面试成功率。此外,他还编写了《尼恩Java面试宝典》等资料,涵盖了大量面试题和答案,帮助读者全面提升技术面试的表现。这些资料不仅内容详实,而且持续更新,是求职者备战技术面试的宝贵资源。
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
|
2月前
|
存储 Oracle 关系型数据库
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
从基本特性、技术选型、字段类型、事务提交方式、SQL语句、分页方法等方面对比Oracle和MySQL的区别。
371 18
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
|
2月前
|
SQL 关系型数据库 MySQL
MySQL基础:事务
本文详细介绍了数据库事务的概念及操作,包括事务的定义、开启、提交与回滚。事务作为一组不可分割的操作集合,确保了数据的一致性和完整性。文章还探讨了事务的四大特性(原子性、一致性、隔离性、持久性),并分析了并发事务可能引发的问题及其解决方案,如脏读、不可重复读和幻读。最后,详细讲解了不同事务隔离级别的特点和应用场景。
123 4
MySQL基础:事务
|
30天前
|
SQL 关系型数据库 MySQL
【MySQL】索引和事务
【MySQL】索引和事务
47 0
|
2月前
|
SQL Oracle 关系型数据库
详解 MySQL 的事务以及隔离级别
详解 MySQL 的事务以及隔离级别
36 0
|
3月前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
127 0
|
3月前
|
C# Windows 监控
WPF应用跨界成长秘籍:深度揭秘如何与Windows服务完美交互,扩展功能无界限!
【8月更文挑战第31天】WPF(Windows Presentation Foundation)是 .NET 框架下的图形界面技术,具有丰富的界面设计和灵活的客户端功能。在某些场景下,WPF 应用需与 Windows 服务交互以实现后台任务处理、系统监控等功能。本文探讨了两者交互的方法,并通过示例代码展示了如何扩展 WPF 应用的功能。首先介绍了 Windows 服务的基础知识,然后阐述了创建 Windows 服务、设计通信接口及 WPF 客户端调用服务的具体步骤。通过合理的交互设计,WPF 应用可获得更强的后台处理能力和系统级操作权限,提升应用的整体性能。
98 0
|
3月前
|
存储 关系型数据库 MySQL
MySQL 中的事务存储引擎深入解析
【8月更文挑战第31天】
51 0