MySQL事务隔离级别

2019-11-02  本文已影响0人  小螺钉12138

一、MySQL事务级别分类

二、MySQL事务级别详解

2.1.READ UNCOMMITTED

未提交读,顾名思义表示的是在该隔离级别下一个事务能够读取另一个事务未提交的记录

具体表现为

READ-UNCOMMITTED-1.png

2.2.READ COMMITTED

已提交读,只能只能够读取另一个事务提交的修改记录

具体表现

READ-COMMITTED-1.png

2.3.REPEATABLE READ

可重复读,从一个事务开始到提交,读取的数据不会发生变化(由于其他事务的修改)

具体表现

REPEATABLE-READ-1.png

2.4.SERIALIZABLE

串行化,每条指令都会进行加锁然后一条指令一条指令的运行

具体表现

image

三、MySQL的多并发版本控制(MVCC)

MVCC是一个行级锁的变种,在很多情况下避免了加锁的操作,因此开销更低。MVCC的具体实现,是通过保存数据在某个时间点的快照来实现的

InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存行的过期时间(或删除时间)。存储的并不是实际的时间,而是系统的版本号。每开始一个新的事务,系统版本号会自动递增。

MVCC只有在READ COMMITTED和REPEATABLE READ这两个隔离级别才有效,因为READ UNCOMMITTED和SERIALIZABLE这两个级别前者是读取最新的数据,后者是对所有的读取的行都加锁,所以针对这两个级别,MVCC无效

MVCC会根据以下两个条件来检索每行记录

四、ReadView

在innodb中,在MVCC有效的隔离级别查找数据(select * from table)时会创建一个
ReadView,然后将数据库中的数据和ReadView中作对比,以此判断该行数据是否可见

ReadView

ReadView判断可见性算法

READ COMMITED和REPEATABLE READ的区别在于生成ReadView的机制不同,READ COMMITTED每次select数据的时候都会重新生成一个新的ReadView而REPEATABLE READ是事务开始前select数据,在事务提交之前所有的select都复用第一次生成的ReadView所以事务中查看的数据都是一样的

查询结果底层分析

以提交读级别为例分析出现的结果

[图片上传失败...(image-6c71e0-1572695701127)]

id name trx_id rollback_id
1 张一 trx_1 null
id name trx_id rollback_id
1 张一 trx_1 null
1 张一1 trx_3 trx_1

三、总结

从上边的描述中我们可以看出来,所谓的MVCC(Multi-Version Concurrency Control ,多版本并发控制)指的就是在使用READ COMMITTD、REPEATABLE READ这两种隔离级别的事务在执行普通的SEELCT操作时访问记录的版本链的过程,这样子可以使不同事务的读-写、写-读操作并发执行,从而提升系统性能。READ COMMITTD、REPEATABLE READ这两个隔离级别的一个很大不同就是生成ReadView的时
机不同,READ COMMITTD在每一次进行普通SELECT操作前都会生成一个ReadView,而REPEATABLE READ只在第一次进行普通SELECT操作前生成一个ReadView,之后的查询操作都重复这个ReadView就好了

以上的结论是笔者查阅了大量资料以及试验所得,如果误差,欢迎一起探讨

上一篇 下一篇

猜你喜欢

热点阅读