我有一个场景,其中我的集群处于读提交隔离模式,用例如下所示:
执行select语句大约需要1分钟才能运行查询并返回响应。
在此期间,可以在1分钟的时间范围内对数据进行更新(提交)。
那么,我的问题是,我是在答复中得到更新的记录还是旧的记录?我读过文档,它提到任何幻影读取都是允许的。
我在这里很困惑,所以只想弄清楚一点,请帮忙。
Using READ COMMITTED has additional effects(Reference MYSQL docs):发布于 2021-01-01 22:12:51
数据的并发更新不可能在执行时修改给定的查询。这就好像每个查询都在自己的可重复读取快照中运行,即使您的事务已被提交。
它将返回在语句开始执行时已提交的行。它将不包括在语句开始后提交的任何行。
关于你的评论:
不,没有事务隔离级别可以改变这一点。即使使用读未提交,给定的查询也只读取在查询开始执行时已提交的行。
如果要查询最近的更新,只能启动新的查询。
如果您担心您没有收到关于最近更新的通知,那么您需要优化您的查询,以便不需要60秒的时间执行。
这听起来像是在轮询数据库。运行频繁的昂贵查询来轮询数据库,这表明您可能需要使用消息队列。
关于你的第二条评论:
锁定SQL语句,包括UPDATE和DELETE,以及锁定SELECT语句,即使您的事务是可重复读取的,也会像READ提交一样起作用。锁定语句总是读取在语句开始时提交的最新行。
但是,它们仍然无法读取在语句启动后提交的新行。如果没有别的原因,除了他们无法获得这些行的锁。
您最初的问题是关于SELECT语句的,我认为您是指非锁定SELECT (也就是说,没有更新或锁定共享模式的选项)。这些SELECT语句也不能查看在SELECT启动后添加的行。
我从来没有发现阅读的任何目的都没有得到很好的利用。
发布于 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
https://stackoverflow.com/questions/65534106
复制相似问题