首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MYSQL的读提交隔离中将返回哪个版本的记录

问在MYSQL的读提交隔离中将返回哪个版本的记录
EN

Stack Overflow用户
提问于 2021-01-01 22:06:59
回答 2查看 122关注 0票数 2

我有一个场景,其中我的集群处于读提交隔离模式,用例如下所示:

执行select语句大约需要1分钟才能运行查询并返回响应。

在此期间,可以在1分钟的时间范围内对数据进行更新(提交)。

那么,我的问题是,我是在答复中得到更新的记录还是旧的记录?我读过文档,它提到任何幻影读取都是允许的。

我在这里很困惑,所以只想弄清楚一点,请帮忙。

代码语言:javascript
复制
Using READ COMMITTED has additional effects(Reference MYSQL docs):
  1. 对于UPDATE或DELETE语句,InnoDB只对其更新或删除的行持有锁。在MySQL评估WHERE条件之后,将释放不匹配行的记录锁。这大大降低了死锁的可能性,但仍然有可能发生。
  2. 对于UPDATE语句,如果某一行已经锁定,InnoDB将执行“半一致”读取,将最新提交的版本返回给MySQL,以便MySQL能够确定该行是否与更新的WHERE条件匹配。如果该行匹配(必须更新),MySQL将再次读取该行,这次InnoDB要么锁定它,要么等待它的锁。
EN

回答 2

Stack Overflow用户

发布于 2021-01-01 22:12:51

数据的并发更新不可能在执行时修改给定的查询。这就好像每个查询都在自己的可重复读取快照中运行,即使您的事务已被提交。

它将返回在语句开始执行时已提交的行。它将不包括在语句开始后提交的任何行。

关于你的评论:

不,没有事务隔离级别可以改变这一点。即使使用读未提交,给定的查询也只读取在查询开始执行时已提交的行。

如果要查询最近的更新,只能启动新的查询。

如果您担心您没有收到关于最近更新的通知,那么您需要优化您的查询,以便不需要60秒的时间执行。

这听起来像是在轮询数据库。运行频繁的昂贵查询来轮询数据库,这表明您可能需要使用消息队列。

关于你的第二条评论:

锁定SQL语句,包括UPDATE和DELETE,以及锁定SELECT语句,即使您的事务是可重复读取的,也会像READ提交一样起作用。锁定语句总是读取在语句开始时提交的最新行。

但是,它们仍然无法读取在语句启动后提交的新行。如果没有别的原因,除了他们无法获得这些行的锁。

您最初的问题是关于SELECT语句的,我认为您是指非锁定SELECT (也就是说,没有更新或锁定共享模式的选项)。这些SELECT语句也不能查看在SELECT启动后添加的行。

我从来没有发现阅读的任何目的都没有得到很好的利用。

票数 3
EN

Stack Overflow用户

发布于 2021-01-01 22:15:13

默认情况下,INNOBD将在处理过程中锁定表,但是有一些方法可以进行未锁定的选择。在这种情况下,它将在表的版本快照上运行,因此处理过程中的任何提交都不会更改结果。

有关更多信息:https://dev.mysql.com/doc/refman/8.0/en/innodb-consistent-read.html

在任何情况下,数据库的ACID属性都会防止不稳定的函数:https://en.wikipedia.org/wiki/ACID

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65534106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档