前因后果
- 由来:为了解决并发事务带来的问题,隔离级别定义了并发事务间的相互影响程度;
- 结果:不同的隔离级别应用于不同场景,常用RR(MySQL默认)和RC;
- 实现:基于MVCC和锁实现;

分类
按照并发事务间相互影响的程度,事务隔离级别分成如下四种:
- 读未提交(Read Uncommitted):允许事务A读取其它事务未提交的记录,会发生脏读、不可重复读、幻读;
- 读已提交(Read Committed):只允许事务A读取其它事务已提交的记录,不会发生脏读,但会出现重复读、幻读;
- 可重复读(Repeatable Read):事务A执行期间,多次相同查询结果一致,不会发生脏读和不可重复读的问题,但会发生幻读问题;但InnoDB在RR隔离级别下利用MVCC或者间隙锁可以禁止幻读问题的发生;
- 可串行化(Serializable):即事务串行执行,以上各种问题自然也就都不会发生。

实现
不同数据库对于SQL标准中规定的隔离级别支持是不一样的。相对于传统隔离级别基于锁的实现方式,InnoDB引擎基于MVCC和行级锁实现事务隔离级别:通过MVCC无锁方案,解决事务读写并发问题,通过两阶段锁来实现写-写并发控制;

RR实现
- 对于普通select语句,基于MVCC实现。普通select使用快照读,同一事务内使用相同版本的数据快照(解决不可重复度);
- 对于带锁select和写操作,基于锁实现。通过Record Lock锁定某条记录,使用Gap Lock防止区间内插入新数据(解决幻读);

RC实现
- 对于普通select语句,基于MVCC实现。普通select使用快照读,每次查询使用已提交的新版本数据快照(导致不可重复读);
- 对于带锁select和写操作,基于锁实现。通过Record Lock锁定某条记录,RC隔离级别中不存在Gap Lock(导致幻读);

参考:
本文介绍了InnoDB事务隔离级别的概念,包括读未提交、读已提交、可重复读和可串行化,详细阐述了MySQL默认的RR(可重复读)隔离级别下如何利用MVCC和锁避免并发问题,以及RC实现的区别。分析了各隔离级别对并发事务的影响,如脏读、不可重复读和幻读,并讨论了InnoDB如何通过MVCC和行级锁实现高并发下的事务处理。
1483

被折叠的 条评论
为什么被折叠?



