文章目录
- 前言
- 一、什么是事务隔离级别?
- 二、四大隔离级别详解
- 1.读未提交(Read Uncommitted)
- 2.读已提交(Read Committed)
- 3.可重复读(Repeatable Read)--MySQL默认级别
- 4.串行化(Serializable)
- 总结
前言
本文主要介绍了我在MySQL的学习之中的收获,本次主要记录MySQL的学习中对事务的隔离级别的知识总结。(听说这部分内容是面试的时候的高频面试部分)开干!!
提示:以下是本篇文章正文内容,主要是通过文字的介绍形式来完成学习的记录。
一、什么是事务隔离级别?
数据库允许多个事务并行,多个事务之间是相互独立与隔离的,如果事务之间不相互隔离并且操作与统一数据时,可能会导致数据的一致性被破坏。
内容补充:ACID原则分别为原子性、隔阂性、一致性、持久性。
二、四大隔离级别详解
在多个事务线程共同作用于数据库服务器的情况下将产生的四大隔离级别问题如下所言,本次实验就以两个不同的事务线程为例进行说明
1.读未提交(Read Uncommitted)
解释:事务1可以读取事务2执行中但是并未提交的数据,这种情况一般发生在事务1中出现了错误导致事务1中执行成功了的部分的数据仍然存储于数据库连接缓存中,事务2在本应该读取数据库服务器中的数据时却误读了事务1存储于连接缓存中的数据,因此导致读取数据错误,导致所谓的“脏读”。
什么是“脏读”?
即一个事务读取到了另一个事务中未提交的数据,该数据一般滞留与连接缓存区域中。
2.读已提交(Read Committed)
事务2只能够读取事务1中已经提交了的数据(即该数据已经通过手动提交完成了事务中的所有对数据库操作),这样可以避免“脏读”的出现,但是会造成“不可重复读(虚读)”的问题出现。
什么是“虚读”?
即在同一个事务中,两次查询操作获取到的数据不一致。
例如:事务2进行第一次查询之后在第二次查询之前,事务1修改并提交了新的数据,事务2进行第二次查询时读取到的数据和第一次查询到的数据不一致。
3.可重复读(Repeatable Read)–MySQL默认级别
事务2执行第一次查询之后,在事务结束之前其他事物不能修改对应的数据,避免了不可重复读(虚读),但是会造成“幻读”的问题出现。
什么是“幻读”?
即事务2对数据表中的数据进行修改后然后进行查询,在查询之前事务1向数据表中新增了一条数据,就导致了事务2以为修改了所有的数据,但是最终查询除了与修改不一致的数据(事务1新增的数据),产生了查询结果的错误。
4.串行化(Serializable)
同时只允许一个事务对数据表进行操作,避免了脏读、虚读、幻读等问题,但是效率很低。
例如:如果你要去银行办理一张卡,那么你必须等这个银行的所有用户都停止对银行的操作后你才能办理卡,显然这种事是不存在的主要是为了方便大家理解,哈哈~~所以串行化效率不高。
总结
隔离级别 | 脏读 | 虚读(不可重复读) | 幻读 |
读未提交(Read Uncommitted) | √ | √ | √ |
读已提交(Read Committed) | × | √ | √ |
可重复读(Repeatable Read) | × | × | √ |
串行化(Serializable) | × | × | × |
以上就是今天要讲的内容,本文仅仅简单介绍了MySQL中四大隔离级别的介绍,建议本部分内容要深入理解,我问了几个老哥听说现在面试官都很喜欢问MySQL底层的东西。
点赞+关注=开发者的基本素养~~