首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止竞态条件下select found_rows中断?

问如何防止竞态条件下select found_rows中断?
EN

Stack Overflow用户
提问于 2017-10-25 20:58:16
回答 1查看 515关注 0票数 2

我必须运行一个有限制和偏移量的查询,并且我还需要结果的总数来构建分页。这是一个复杂的查询,有很多条件和连接,所以我想避免为了得到计数而重复查询。

根据mysql docs的说法,我可以这样做:

代码语言:javascript
复制
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
    -> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();

但是当我一次收到数千个请求时会发生什么,最终会有这样的情况发生:

代码语言:javascript
复制
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
    -> WHERE __CONDITION1__ > 100 LIMIT 10; //count from query 1
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
    -> WHERE __CONDITION2__ LIMIT 10; //count from query 2
mysql> SELECT FOUND_ROWS(); //should be count form query 1 but it's count from query 2
mysql> SELECT FOUND_ROWS(); // count from query 2 but it's always 1

我已经将查询封装在单独的事务中,但就我对there's no guarantee it'll prevent this race condition.的理解而言

所以这里有两个问题,我能以某种方式强制我的事务来防止这种竞争情况吗?如果不是,有没有其他方法可以不用再次执行查询并检索计数?

EN

回答 1

Stack Overflow用户

发布于 2017-10-25 22:03:45

当涉及到事务时,存在某些问题,不同的隔离级别或多或少地阻止了这些问题。我已经在我的答案here中描述了这一点。

例如,像phantom这样的问题可能会影响select的结果,就像你正在做的那样,是的。但是,一旦查询完成,SQL_CALC_FOUND_ROWS的结果就会被存储起来,一旦您在同一会话中执行另一个查询,它的结果就会丢失。这是最重要的部分。SQL_CALC_FOUND_ROWS是会话绑定。不可能将另一个会话中的另一个查询的结果存储在当前会话中。SQL_CALC_FOUND_ROWS的使用不受竞态条件的限制。SELECT查询的结果为yes,但不是FOUND_ROWS()的结果。不要混淆这一点。

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

https://stackoverflow.com/questions/46933132

复制
相关文章

相似问题

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