你真的懂数据库的隔离级别吗?不懂请进

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 哎呀妈,又是数据库的隔离级别,大家都要听吐了,每次面试或者和数据库相关的技术分享总会提到数据库的隔离级别,大家真的搞清楚了吗,每种隔离级别都有什么特点,我们该如何选择合适的事物隔离级别。(本文仅针对MySQL数据库介绍)

1 MySQL的事物隔离级别是为了解决什么问题?

事物隔离级别是为了解决事物并发问题。

事物并发问题其实就和我们在编写并发程序时的线程安全问题是类似的,线程安全问题是多个线程同时修改了一个变量,如果不加锁,就可能出现类似于超卖这种类型的问题。事物并发,是多个客户端连接同时修改数据库的某条记录也可能会出现类似的问题,并且事物是会发生回滚的,这就又加重了问题的复杂程度。

我们将事物并发问题总结起来,就是以下几种:

  • 脏读: 事务A读取了事务B修改的数据,然后事物B回滚,那么事物A读取到的数据是脏数据
  • 不可重复读: 事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取到的同一数据时不一致。
  • 幻读: 事物A将数据库中所有数据修改为另一种形式,但是事物B就在这个时候插入了一条新的数据,事物A修改结束后发现仍有一条记录没有修改过来,就像发生了幻觉一样,这就叫幻读。

总结:

不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。

解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁整张表。

2 MySQL中都有哪些隔离级别?

SQL的标准就是定义了四种隔离级别,

基于上诉事物并发问题,MySQL为我们提供了几种解决方案,就是如下几种(√ 选的是会出现问题的

事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted)
读已提交(read-committed)
可重复读(repeatable-read)默认 (√)
串行化(serializable)

每一种隔离级别其实也就是锁的级别,什么问题都忽略即不加锁,什么问题都解决即将并行执行转为串行执行。

随着加锁的程度越来越强,数据库的并发性能越来越弱。

3 MySQL的每种隔离级别都会加什么锁?

  • 读未提交(性能优,问题多)

    加锁情况:

    • 事务在读数据的时候并未对数据加锁。
    • 事务在修改数据的时候只对数据增加行级共享锁。
  • 读已提交(互联网常常使用的隔离级别,性能优)

    读已提交其实是针对于事物而言,不读取没有提交的事物,这样就不会产生脏读。

    读已提交的事务隔离级别是大多数流行数据库的默认事务隔离界别,比如 Oracle,但是不是 MySQL 的默认隔离界别。

    加锁情况:只会对索引增加 Record Lock

    • 事务对当前被读取的数据加行级共享锁(当读到时才加锁),一旦读完该行,立即释放该行级共享锁;
    • 事务在更新数据的瞬间(就是发生更新的瞬间),必须先对其加行级排他锁,直到事务结束才释放。
  • 可重复读

    可重复读是将读取到的数据锁定起来,保证在事物内,读取到的数据是一致的。

    MySQL为了解决幻读问题增加了 Gap Lock 和 Next-Key Lock(可通过配置文件设置);

    加锁情况:为了解决幻读的问题,在支持 Record Lock 的同时,还支持 Gap Lock 和 Next-Key Lock;

    • 事务在读取某数据的瞬间(就是开始读取的瞬间),加行级共享锁,直到事务结束才释放;
    • 事务在更新某数据的瞬间(就是发生更新的瞬间),加行级排他锁,直到事务结束才释放。
  • 串行化

    直接把并行变为串行,相当于单线程执行任务,性能极低,一般不会使用。

    加锁情况:

    • 事务在读取数据时,必须先对其加表级共享锁 ,直到事务结束才释放;
    • 事务在更新数据时,必须先对其加表级排他锁 ,直到事务结束才释放。

推荐两篇之前写的博文:

如果对MySQL锁概念不了解的可以阅读《MYSQL的锁介绍》。

MySQL为了优化加锁的性能,采用了MVCC多版本并发控制,如果不了解可以阅读《MySQL中的MVCC是怎么实现的,你们知道吗?》。

4 总结

事物的隔离级别就是数据库为我们提供了选择的权利,在性能和数据准确程度上,根据业务做取舍,有舍必有得。

对于MySQL来说InnonDB引擎才会有事物和事物隔离级别的说法。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中如何与事务隔离级别结合使用
乐观锁在分布式数据库中如何与事务隔离级别结合使用
187 5
|
SQL 关系型数据库 数据库
事务隔离级别:保障数据库并发事务的一致性与性能
事务隔离级别:保障数据库并发事务的一致性与性能
|
SQL Java 数据库
第一季:8spring支持的常用数据库事务传播属性和事务隔离级别【Java面试题】
第一季:8spring支持的常用数据库事务传播属性和事务隔离级别【Java面试题】
262 0
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中如何与事务隔离级别结合使用
乐观锁在分布式数据库中如何与事务隔离级别结合使用
|
数据库
什么是数据库的事务隔离级别,有什么作用
【10月更文挑战第21】什么是数据库的事务隔离级别,有什么作用
196 3
|
存储 关系型数据库 数据挖掘
什么是数据库的事务隔离级别
【10月更文挑战第21】什么是数据库的事务隔离级别
354 1
|
人工智能 小程序 关系型数据库
【MySQL】黑悟空都掌握的技能,数据库隔离级别全攻略
本文以热门游戏《黑神话:悟空》为契机,深入浅出地解析了数据库事务的四种隔离级别:读未提交、读已提交、可重复读和串行化。通过具体示例,展示了不同隔离级别下的事务行为差异及可能遇到的问题,如脏读、不可重复读和幻读等。此外,还介绍了在MySQL中设置隔离级别的方法,包括全局和会话级别的调整,并通过实操演示了各隔离级别下的具体效果。本文旨在帮助开发者更好地理解和运用事务隔离级别,以提升数据库应用的一致性和性能。
276 2
【MySQL】黑悟空都掌握的技能,数据库隔离级别全攻略
|
关系型数据库 MySQL 数据库
深入理解MySQL数据库隔离级别
深入理解MySQL数据库隔离级别
358 1
|
SQL 关系型数据库 MySQL
数据库隔离级别详解,数据库基础操作
数据库隔离级别详解,数据库基础操作
382 1
|
存储 SQL 关系型数据库
什么是数据库隔离级别
【10月更文挑战第15天】什么是数据库隔离级别

热门文章

最新文章

下一篇
oss云网关配置