mysql 解决了幻影读_mysql REPEATABLE READ对幻读的解决

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值