【发布时间】:2012-05-10 15:18:51
【问题描述】:
我有一个表 (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 时强制表级锁定?
【问题讨论】:
-
您是否可以发布 SELECT 和 UPDATE 的示例......
-
你在用什么isolation level?如果您使用
READ UNCOMMITTED或“脏读”,则可能会发生这种情况。 -
@MarcusAdams 无论 InnoDB 的默认隔离级别是什么,都不确定这是否能回答您的问题。
-
@pixelfreak 查看我的答案,以不同的方式执行此操作......