【MySQL系列】——事务隔离及MVCC

本文详细介绍了MySQL的事务隔离级别,包括脏读、不可重复读和幻读的概念,以及事务的四大隔离级别。重点讲解了可重复读隔离级别和读提交隔离级别的实现原理,涉及MVCC(多版本并发控制)、一致性视图(read view)及其工作过程,帮助读者理解MySQL如何保证事务的隔离性。
摘要由CSDN通过智能技术生成

0 前言

最近参加春招的过程中,被面试官问了这么一个题目
面试官:你知道mysql默认的事务隔离级别吗?
我:可重复读
面试官:那你知道可重复读是怎么实现的吗?
我:沉默…视图?…加锁?
面试官:你说到视图,什么是视图?你说到加锁,所以其他事务就不能读了?
面试完之后,我痛定思痛,一定要把这块知识搞明白,所以写此博客来记录我对事务隔离的理解,有讲得不好的地方请多多原谅。

1 事务的隔离级别

首先事务就是要保证一组数据库操作,要么全部成功,要么全部失败。而提到事务,我们可以想到事务的四大特征(Atomicity,Consistency,Isolation,Durability),今天我主要讲的是其中的隔离性。

1.1 什么是脏读、不可重复读、幻读?

首先在讲解事务的隔离级别之前,要搞明白为什么需要事务隔离?因为当多个事务同时执行的时候,会出现脏读、不可重复读和幻读。

  • 脏读:脏读指的是一个事务访问数据,并修改了数据,但是事务还没有提交,另一个事务也访问了这个数据,就会出现脏读。
  • 不可重复读:不可重复读指的是一个事务中两次访问了数据,在这期间,另一个事务对该数据进行了修改并提交了事务,导致第一个事务两次读取的结果不一致。
  • 幻读:幻读指的是一个事务正在进行全表更新操作,这个时候另一个事务在这个表新增了一条数据,并且提交了,对于第一个事务来说,会发现还有数据行没有更新,出现了幻读。

1.2 事务的四大隔离级别

事务的隔离级别包括:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable)。

  • 读未提交(read uncommitted):一个事务还没提交,它做的修改可以被其他事务看到。
  • 读提交(read committed):一个事务提交了,它做的修改才可以被其他事务看到。
  • 可重复读(repeatable read):一个事务执行过程中看到的数据,跟事务启动的时候看到的数据是一致的。
  • 串行化(serializable):对同一行记录,读会加“读锁”,写会加“写锁”。当出现锁冲突的时候,后访问的事务必须等到前一个事务提交之后,才能执行。

举个例子来说明在四种不同的隔离级别下,事务A中V1,V2,V3的返回值是什么?
图1

  • 若隔离级别是读未提交:在读
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值