我有一个表格,其中有一个名为status
的列,其值可以是1,2和3.
假设表名是ANYTHING,我的应用程序中的某个线程执行了查询
SELECT order_num, `status` from ANYTHING WHERE status = 2
它将返回2条记录,如下所示。
order_num status
D2017101100001 2
D2017101100002 2
之后,同一应用程序中的另一个线程将D2017101100001
的状态更新为3
,我们可以看到状态从Navicat客户端更改为3。
然后触发查询
SELECT order_num, `status` from ANYTHING WHERE status = 2
再次,但不幸的是我们得到了与以前相同的结果,D2017101100001
仍然返回。
然后我们执行了
SELECT order_num, `status` from ANYTHING WHERE status = 3
D2017101100001
将不会被退回。
但是几秒钟后,每次正常D2017101100001
将从条件status = 3
返回,而不是从status = 2
返回。
我们怀疑它是由查询缓存引起的,但是当我们检查QChace状态时,QCache_hits为0,如下所示。
Variable_name value
Qcache_free_blocks 1
Qcache_free_memory 1031832
Qcache_hits 0
Qcache_inserts 0
Qcache_lowmem_prunes 0
Qcache_not_cached 31050313
Qcache_queries_in_cache 0
Qcache_total_blocks 1
Qcache_total_blocks 1
我们也使用了mybatis,但是我们为这个查询设置了first_level缓存,并且看到了数据库命中日志,所以看起来根本原因仍然在mysql端。
如果有人以前遇到过此问题?请给我们一些帮助。