mysql REPEATABLE READ对幻读的解决
环境说明: mysql 5.7 + innodb引擎
幻读定义
幻读指在同一个事务中,两次相同的查询结果集不同,当然要排除select->delete->select的情况。 具体参考官网:
REPEATABLE READ解决幻读的方式
REPEATABLE READ 隔离级别通过MVCC和next-key lock实现解决幻读
MVCC 多版本并发控制
概念
MVCC允许数据具有多个版本,版本可以是时间戳或者是全局递增的事务ID。在MVCC协议下,每个读操作会看到一个一致的数据快照,这意味着,在同一个时间点,不同的事务看到的数据可能是不同的。
在 REPEATABLE READ下的实现
innodb会为每一行记录添加两个隐藏的列,分别表示该行记录创建的版本(数据何时被创建)和删除的版本(数据何时被删除),填入的是事务的版本号,这个版本号随着事务的创建不断递增。
在REPEATABLE READ的隔离级别下,具体各种数据库操作的实现如下:
select select返回的记录必须符合下面两个条件:
该行的创建版本号小于等于当前版本号,用于保证在事务创建时或事务开始之前这行数据是存在的。
该行的删除版本号大于当前版本或者为空。用于保证在事务开始之前这行数据没有被删除。
insert 将新插入的行的创建版本号设置为当前系统的版本号,删除版本号为空
delete 将该行的删除版本号设置为当前系统的版本号,并不把数据实际删除
update 转换成insert + delete