2020-12-14:mysql中,可重复读是怎么实现的?

举报
福大大架构师每日一题 发表于 2020/12/14 20:53:30 2020/12/14
【摘要】 福哥答案2020-12-14:[答案来自此链接:](http://bbs.xiangxueketang.cn/question/735)快照读:就是select。MVCC。select * from table ….;当前读:特殊的读操作,插入/更新/删除操作,属于当前读,处理的都是当前的数据,需要加锁。为了解决当前读中的幻读问题,MySQL事务使用了Next-Key锁。select * f...

福哥答案2020-12-14:

[答案来自此链接:](http://bbs.xiangxueketang.cn/question/735)

快照读:就是select。MVCC。
select * from table ….;

当前读:特殊的读操作,插入/更新/删除操作,属于当前读,处理的都是当前的数据,需要加锁。为了解决当前读中的幻读问题,MySQL事务使用了Next-Key锁。
select * from table where ? lock in share mode;
select * from table where ? for update;
insert;
update ;
delete;

MVCC在MySQL的InnoDB中的实现如下:
在InnoDB中,会在每行数据后添加两个额外的隐藏的值来实现MVCC,这两个值一个记录这行数据何时被创建,另外一个记录这行数据何时过期(或者被删除)。 在实际操作中,存储的并不是时间,而是事务的版本号,每开启一个新事务,事务的版本号就会递增。 在可重读Repeatable reads事务隔离级别下:
1.SELECT时,读取创建版本号<=当前事务版本号,删除版本号为空或>当前事务版本号。
2.INSERT时,保存当前事务版本号为行的创建版本号。
3.DELETE时,保存当前事务版本号为行的删除版本号。
4.UPDATE时,插入一条新纪录,保存当前事务版本号为行创建版本号,同时保存当前事务版本号到原来删除的行。
通过MVCC,虽然每行记录都需要额外的存储空间,更多的行检查工作以及一些额外的维护工作,但可以减少锁的使用,大多数读操作都不用加锁,读数据操作很简单,性能很好,并且也能保证只会读取到符合标准的行,也只锁住必要行。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。