mysql事务隔离级别的实现原理
mysql事务隔离级别的实现原理 mysql innodb中的四种事务隔离级别上文主要以实验的形式的展示了四种隔离级别产生的读一致性问题,本文主要讨论一下mysql是如何实现这四种隔离级别的。 一、什么是事务的隔离级别 在数据库系统中,一个事务是指:由一系列数据库操作组成的一个完整的逻辑过程。具备ACID的特性。ACID分别指原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、永久性(Durability)。 事务隔离(Isolation):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。针对这种不一致的级别,产生了事务隔离的四个类别,包括未提交读(Read uncommitted)、提交读(read committed)、可重复读(repeatable read)和串行化(Serializable)。 可重复读(Repeated Read)是mysql的默认级别,本文以它为分析重点。 二、再看可重复读 可重复读:举例来说就是在一个事务内,如果先后发生了两次查询$Q_1, Q_2$,如果$Q_2$看到的内容只包含$Q_1$的内容和自已在本次事务中的内容,看不到其他事务操作的结果(无论其他事务对$Q_1$内容更新还是删除),那么这个就叫可重复读。 这里需要再次强调不可重复读和幻读的区别,不可重复读是针对删除和更新的,幻读是针对插入的。看起来幻读是属于不可以重复读的范畴的,但是为什么要分开呢? 个人觉得是因为解决这两个的方式是不同的,对于不可重复读,可以直接用普通的锁来解决。但是对于幻读,由于不可能锁住不存在的记录,所以这里就分开了,对于幻读其实是用的Next_Key锁(行锁+Gap锁)来解决的,这个上一篇文章有提到。 三 实验一(读-写操作) 关闭自动提交、设置隔离级别为可重复读 开始时刻,会话A,B查询到的结果如下: mysql> select * from test; +----+---------+ | id | account | +----+---------+ | 1 | 400 | | 2 | 500 | | 3 | 600 | +----+---------+ 3 rows in set (0.00 sec) 会话B插入一条记录并提交 mysql> select * from test; +----+---------+ | id | account | +----+---------+ | 1 | 400 | | 2 | 500 | | 3 | 600 | +----+---------+ 3 rows in set (0....