2022-07-31

这是我写的第18封信,我们会遇到很多事情,很多事情都来妨碍我们的计划,我们的计划也要跟得上变化,没有什么计划应该是一成不变的。比方说,我想每天早上8点到8点30之间来更新,但这周就拼拼需要早点去上班,8点就出门赶地铁去了。

MySQL当前读

有一个场景,我就有疑惑过:既然MySQL在事务的过程中实现了多版本并发控制,能读取的数据就应该是小于等于当前的数据版本,那为什么写的场景能够把数据写正确呢?

image.png

假设id 是1的记录score初始值为0,左边的事务执行完成之后,score的结果是5而不是2。

如果只从多版本并发控制上来说,有点摸不着头脑。

如果我这样理解,多版本是用来解决读一致问题的,对于写的场景,多版本并不能控制。但其实写的场景里也包含读的部分,MySQL要更新一行记录,总得先把记录读取出来,更新完成之后,再写入内存。

从单条语句上来分析,MySQL 写就是写,它是一个完整的事务,而不会因为它内部有读的逻辑,而拆分成两个事务。

这就是写场景的当前读,写场景读取的数据一定是最新版本的数据。所以,例子中左边的事务其实会阻塞,直到右边的事务执行完毕。

在对查询语句加锁的访问,比如,for update ,触发的也是当前读。当前读就可能会有阻塞等待的情况。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第一部分 读书笔记 1.趣店的罗老板正在死命的向直播电商砸钱买流量,但是做的事情已经和之前的互联网金融没什么关系...
    素面朝人海阅读 314评论 0 1
  • 锁的概念 之前我们学习过多线程,多线程当中如果想保证数据的准确性是如何实现的呢?没错,通过同步实现。同步就相当于是...
    码农Kkio阅读 349评论 0 1
  • ❤️本周践行目标发圈情况总结: (有数据、有心得、有总结、有下一步) 1、这周开始Now冥想APP的使用,完成了7...
    制心一处_无为而无不为阅读 375评论 0 1
  • 设计模式 一.六大设计原则 1.开闭原则:针对扩展开放,修改关闭; 2.里氏替换原则:任何父类出现的地方都可由其子...
    说好的蔚蓝天空呢阅读 585评论 0 0
  • 数据库的基本是概念名词解释: 数据库名词解释 元组:可以理解为表的每一行就是一个元组 候选码:若关系中的某一属性组...
    杰伦哎呦哎呦阅读 1,166评论 0 6