您好,欢迎来到有书房!

Mysql的四种事务隔离级别

分类:知识大全作者:互联网王者 发布时间:2019-02-05 16:29:46阅读:3.6万+ 属地:未知

引言:在说隔离级别前,先说几个数据库并发导致的问题,包括脏读、幻读、不可重复读等。本质上无论哪种问题都是数据不一致的问题,为了解决这些问题,数据库设计者就提出了数据库的隔离级别机制,MySQL的隔离级别主要有以下四种。

        

        在说隔离级别前,先说几个数据库并发导致的问题,包括脏读、幻读、不可重复读等。


        1、脏读(Dirty Read),主要发生在两个及以上的事务同时读取同一个数据,其中一个事务首先对数据进行了修改,但没有提交这些修改之前,其他事务也读取了相同的数据。由于第一个事务可能取消了修改(回滚),或者提交了修改,因此其他事务读取到的数据是不正确的。


        2、幻读(Phantom Read),主要发生当一个事务读取一份数据集后,其他事务在该数据集上做插入或者更新操作。这时,第一个事务会继续读取这些已经被更改的数据,导致读取的数据集和前面读的数据集不同,好像出现幻觉一样,称为"幻读"。幻读就是一个事务多次读取到数据集不同。


        3、不可重复读(Non-Repeatable Read, NRR),主要发生在同一个事务内部,当一个事务多次读取同一数据时,如果在这段时间里另一个事务对该数据进行了修改并提交,那么这个事务后续读取的数据就会和之前不同,也就是不可重复读。


        脏读与不可重复读的主要区别在于脏读读取的是一个未提交的数据,而不可重复读则是读取到一个已经被其他事务修改并提交的数据。幻读说的是数据集前后发生了变化,不可重复读说的是同一份数据前后发生了变化。

        本质上无论哪种问题都是数据不一致的问题,为了解决这些问题,数据库设计者就提出了数据库的隔离级别机制,MySQL的隔离级别主要有以下四种。


        1、读未提交(Read Uncommitted):在这个级别下,事务能够读取到其他未提交事务的数据,这会导致脏读、幻读、不可重复读等问题。这种级别通常会引发大量的问题,所以基本上不用于实际应用。


        2、读已提交(Read Committed):这是许多数据库系统的默认隔离级别。在这种级别下,事务只能看见已经提交的事务所做的更改,可以避免脏读问题,但是无法避免幻读和不可重复读问题。


        3、可重复读(Repeatable Read):这是MySQL的默认事务隔离级别。这种级别避免了脏读和不可重复读问题,但是依然会出现幻读问题。MySQL提供了两种办法来避免大部分的幻读问题,就是MVCC和 Next-key Lock


        MVCC(Multi-Version Concurrency Control)允许数据库在同一时间内保存并维护同一条记录的多个版本。这种技术不同的访问者看到数据在不同时间点的快照。MVCC 在 可重复读隔离级别下,它可以防止脏读和不可重复读的情况发生。


        next-key锁,是Record Lock和Gap Lock的组合,由记录锁和间隙锁组合而成,next-key lock 是前开后闭区间,而间隙锁是前开后开区间。next-key lock 在一些场景下会退化成记录锁或间隙锁。


        针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读。MVCC 方式下一个事务过程中看到的数据是一致的,即使中途有其他事务插入了一条数据,也是看不到这条数据的。


        针对当前读(select ... for update 等语句),是通过 next-key lock(记录锁+间隙锁)方式解决了幻读。当事务进行当前读时,会以Next-Key Lock的方式对读取到的数据行加上行锁(Record Lock),再对索引记录两边的间隙加上间隙锁(Gap Lock)。那样当其他事务便不能对上锁的数据进行修改和插入,避免了幻读!


        4、串行化(Serializable):这是最高级别的隔离级别,所有的用户只能顺序执行,因此能避免上述所有的问题。这种级别会严重影响系统并发度,所以基本上也不用于实际应用。


        总结来说,MySQL提供了多种隔离级别来解决并发问题,每个级别都有其优缺点,需要根据具体的业务要求选择不同的事务隔离级别。


声明:本文内容版权归原作者所有,未经授权,禁止转载!

声明:本站仅提供内容存储、展示服务,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的虚假信息,谨防诈骗。如发现有害或侵权内容,可联系本站删除!

发表评论

评论

联系
我们

平台负责人邮箱
282271588@qq.com

关注
公众号

关注官方公众号

下载
安卓版

下载安卓版

回到
顶部