gpt4 book ai didi

MySQL SQL_NO_CACHE 不工作

转载 作者:行者123 更新时间:2023-11-29 00:45:54 25 4
gpt4 key购买 nike

我有一个经常被插入、更新和读取的表 (InnoDB)(通常相隔几毫秒)。我注意到有时 INSERT/UPDATE 之后的 SELECT 语句会得到陈旧的数据。我认为这是由于缓存引起的,但是在将 SQL_NO_CACHE 放在它前面之后实际上并没有做任何事情。

如何确保 SELECT 始终等到上一个 INSERT/UPDATE 完成并且不从缓存中获取数据?请注意,这些语句是从单独的请求中执行的(不在同一代码执行中)。

也许我误解了 SQL_NO_CACHE 实际上做了什么......

更新:

@Uday,INSERT、SELECT 和 UPDATE 语句如下所示:

INSERT myTable (id, startTime) VALUES(1234, 123456)

UPDATE myTable SET startTime = 123456 WHERE id = 1234

SELECT SQL_NO_CACHE * FROM myTable ORDER BY startTime

我尝试过使用交易,但没有成功。

更多更新:

我认为这实际上是 INSERT 的问题,而不是 UPDATE 的问题。 SELECT 语句始终尝试获取按时间排序的最新行。但由于 INSERT 不执行任何表级锁定,因此 SELECT 可能会获取旧数据。有没有办法在执行 INSERT 时强制表级锁定?

最佳答案

查询缓存不是问题。写入会使缓存失效。

MySQL 优先写入,并且使用默认隔离级别 (REPEATABLE READ),您的 SELECT 将不得不等待 UPDATE 完成。

如果您有 CONCURRENT INSERTS,INSERT 可以被区别对待为 MyISAM 启用,InnoDB 也使用记录锁定,因此它不必等待表末尾的插入。

这可能是竞争条件吗?您确定您的选择发生在更新之后吗?您是否正在从可能尚未传播更新的复制服务器读取数据?

如果问题出在并发 INSERT 上,您需要在 MyISAM 上禁用 CONCURRENT INSERT,或者在 INSERT 期间使用 LOCK TABLES 显式锁定表。 InnoDB 的解决方案是相同的,使用 LOCK TABLES 显式锁定 INSERT 上的表。

关于MySQL SQL_NO_CACHE 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10537165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com