vlambda博客
学习文章列表

MySQL:一致性和隔离性问题整体思路

导读

MySQL:一致性和隔离性问题整体思路


关于MySQL 事务的ACID特性、事务的隔离级别、事务并发问题想必大家都有所了解。 本文旨在将这些知识进行串联,体现完整的脉络。

MySQL:一致性和隔离性问题整体思路

一致性

MySQL:一致性和隔离性问题整体思路

事务的一致性指事务执行前后都要满足一些现实世界的约束。比如转账前后总数目不变。数据库中的事务对应着现实世界的一次状态转换,如果将这次转换的全部操作都写入一个事务中,就能通过原子性保证从一个一致变化到另一个一致状态。 但是 并发的事务访问(读写,写写)相同的数据,如果不进行控制,可能会破坏一致性。 比如脏读问题,T1 事务读到T2 事务未提交的值,然后使用这个值进行计算、提交, 但是T2 事务却回滚了,这很有可能会造成不一致问题。 解决并发事务造成的不一致性,需要依靠隔离性解决。


MySQL:一致性和隔离性问题整体思路

隔离性

MySQL:一致性和隔离性问题整体思路


隔离性指多个并发事务执行互不影响,用于解决并发事务可能造成的问题。
隔离性如何实现呢?因为并发问题的根源在于多个事务访问(读写/写写)同一条数据,所以只要在访问相同的数据时进行排队(加锁)就能保证多个并发事务互不影响,这种执行事务的方式叫做可串行执行。


MySQL:一致性和隔离性问题整体思路

隔离级别的提出

MySQL:一致性和隔离性问题整体思路

使用可串行化的方式执行事务虽然能够保证并发事务间互不影响,但是降低了性能。所以为了满足不同场景的需求,数据库的设计人员提出了多种隔离级别,通过牺牲一定的隔离性来提升性能。这些隔离级别按照隔离性由低到高分别是 :读未提交,读已提交,可重复读,串行化。


MySQL:一致性和隔离性问题整体思路

并发问题的引入


随着隔离性的降低,必然会引入一些并发问题,他们分别是:脏读,不可重复读,幻读。
  • 脏读: 一个事务读取到另一个事务未提交的数据。

  • 不可重复读:一个事务修改了另一个事务中读取的数据,导致另一个事务前后两次读取到的结果不一致。

  • 幻读:T1 事务使用条件P查询了一批记录,T2 事务又插入了一批满足条件P的记录然后提交。T1再次查询的时候,发现多了一些记录,这些记录叫“幻影记录”,这种问题叫做幻读。


    并发问题与隔离级别的对应关系如下表所示:


脏读

不可重复读

幻读

读未提交

读已提交

×

可重复读

×

×

串行化

×

×

×


MySQL 中默认的隔离级别是可重复读,这显然是为了追求性能而牺牲了隔离性的策略。按照上图,可重复读的隔离级别是会产生幻读问题的,但是各种MySQL资料上讲“MySQL 的可重复读隔离级别解决了幻读问题”,这是如何实现的呢?以及脏读和不可重复读问题又是如何解决的?点个在看,下期继续分享。


点个在看你最好看