MySQL 是如何实现四大隔离级别的?
一、MySQL 是如何实现四大隔离级别的
首先说读未提交,它是性能较好,也可以说它是最野蛮的方式,因为它压根儿就不加锁,所以根本谈不上什么隔离效果,可以理解为没有隔离。
再来说串行化。读的时候加共享锁,也就是其他事务可以并发读,但是不能写。写的时候加排它锁,其他事务不能并发写也不能并发读。
最后说读提交和可重复读。这两种隔离级别是比较复杂的,既要允许一定的并发,又想要兼顾的解决问题。
为了解决不可重复读,或者为了实现可重复读,MySQL 采用了 MVVC (多版本并发控制) 的方式。
我们在数据库表中看到的一行记录可能实际上有多个版本,每个版本的记录除了有数据本身外,还要有一个表示版本的字段,记为 row trx_id,而这个字段就是使其产生的事务的 id,事务 ID 记为 transaction id,它在事务开始的时候向事务系统申请,按时间先后顺序递增。
一行记录现在有 3 个版本,每一个版本都记录这使其产生的事务 ID,比如事务A的transaction id 是100,那么版本1的row trx_id 就是 100,同理版本2和版本3。
在上面介绍读提交和可重复读的时候都提到了一个词,叫做快照,学名叫做一致性视图,这也是可重复读和不可重复读的关键,可重复读是在事务开始的时候生成一个当前事务全局性的快照,而读提交则是每次执行语句的时候都重新生成一次快照。
对于一个快照来说,它能够读到那些版本数据,要遵循以下规则:
当前事务内的更新,可以读到;
版本未提交,不能读到;
版本已提交,但是却在快照创建后提交的,不能读到;
版本已提交,且是在快照创建前提交的,可以读到;
利用上面的规则,再返回去套用到读提交和可重复读的那两张图上就很清晰了。还是要强调,两者主要的区别就是在快照的创建上,可重复读仅在事务开始是创建一次,而读提交每次执行语句的时候都要重新创建一次。
存在这的情况,两个事务,对同一条数据做修改。最后结果应该是哪个事务的结果呢,肯定要是时间靠后的那个对不对。并且更新之前要先读数据,这里所说的读和上面说到的读不一样,更新之前的读叫做“当前读”,总是当前版本的数据,也就是多版本中最新一次提交的那版。
假设事务A执行 update 操作, update 的时候要对所修改的行加行锁,这个行锁会在提交之后才释放。而在事务A提交之前,事务B也想 update 这行数据,于是申请行锁,但是由于已经被事务A占有,事务B是申请不到的,此时,事务B就会一直处于等待状态,直到事务A提交,事务B才能继续执行,如果事务A的时间太长,那么事务B很有可能出现超时异常。加锁的过程要分有索引和无索引两种情况,比如下面这条语句
update user set age=11 where id = 1
id 是这张表的主键,是有索引的情况,那么 MySQL 直接就在索引数中找到了这行数据,然后干净利落的加上行锁就可以了。
而下面这条语句
update user set age=11 where age=10
表中并没有为 age 字段设置索引,所以, MySQL 无法直接定位到这行数据。那怎么办呢,当然也不是加表锁了。MySQL 会为这张表中所有行加行锁,没错,是所有行。但是呢,在加上行锁后,MySQL 会进行一遍过滤,发现不满足的行就释放锁,最终只留下符合条件的行。虽然最终只为符合条件的行加了锁,但是这一锁一释放的过程对性能也是影响极大的。所以,如果是大表的话,建议合理设计索引,如果真的出现这种情况,那很难保证并发度。
延伸阅读:
二、什么是数据库和数据库管理系统
数据库的应用非常广泛,举个例子,我们平时在浏览器上搜索内容,就要用到数据库去检索我们的关键字。以前我们可能会用数组、集合、文件等来存储数据,但是接下来我们就会面临一个问题,当存储的数据或内容过多的时候,我们如何去精准的找到我们需要的东西,这时候数据库管理系统就派上了用场。除此之外,数据库管理系统还能永久的储存我们的数据。
为了便于大家理解,这里先给大家讲解几个概念
DB数据库(database):存储数据的“仓库”。它保存了一系列有组织的数据。
DBMS数据库管理系统(Database Management System):数据库是通过DBMS创建和操作的容器。
SQL,结构化查询语言(Structured Query Language)用一句话概括,SQL是一种特殊目的的编程语言,一种专门用来与数据库通信的语言。在数据库中,数据被结构化并存储在不同的表中,从而简化了访问,更新和操作数据的过程。该表由列和行组成。数据库中的表可以在关系的帮助下进行连接。要在数据库中执行与数据相关的任务,可以使用SQL。SQL代表结构化查询语言,旨在在特定RDBMS内创建,修改和管理数据库中的数据。
SQL优点:
1、不是某个特定数据库供应商专有的语言,几乎所有DBMS(数据库管理系统)都支持SQL
2、简单易学
3、虽然简单,但实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作。

相关推荐HOT
更多>>
sqlserver与mysql的区别是什么?
1、开发与所有权SQL Server是微软公司的产品,专为Windows平台设计,虽然近年来也推出了Linux版本。MySQL起初是由瑞典的MySQL AB公司开发,后被...详情>>
2023-10-16 20:09:38
format_map与format字符串格式化的区别是什么?
一、数据输入形式1、format: 主要接受位置或关键字参数。"Hello, {0}".format("world")2、format_map: 接受一个字典作为输入。"Hello, {name}"....详情>>
2023-10-16 17:26:04
有效的项目变更管理,能够减少哪些对项目的影响?
1、时间延迟的减少适时评估:变更请求提出后及时评估其对项目进度的影响有效调整:根据评估结果调整工作计划和资源分配控制范围:通过对变更范...详情>>
2023-10-16 17:07:04
站在软件开发的角度如何做bug分类管理?
一、收集BUG信息在软件开发过程中,及时收集BUG信息至关重要。测试团队应该在发现BUG后,立即记录和收集相关信息,包括BUG的描述、复现步骤、严...详情>>
2023-10-16 13:06:03热门推荐
如何使用Geolocation API?
沸Python和C++之间的区别?
热机器学习中,训练集和测试集预测结果差别极大是什么原因?
热sqlserver与mysql的区别是什么?
新好用的在线看板工具有哪些?
Oracle存储过程和函数的区别?
人脸识别系统的技术流程是什么?
什么叫闭型(closed-form)?
管理写作项目有哪些工具?
什么是Gradle Transform?
有哪些 GAN 在分类/判别方面的成功应用?
format_map与format字符串格式化的区别是什么?
有效的项目变更管理,能够减少哪些对项目的影响?
编程语言为什么要区分表达式(expression)和语句(statement)?
技术干货






