gpt4 book ai didi

mysql - 如何防止 select found_rows 在竞争条件下中断?

转载 作者:行者123 更新时间:2023-11-29 05:58:46 25 4
gpt4 key购买 nike

我必须运行一个具有限制和偏移量的查询,我还需要结果总数来构建分页。这是一个包含很多条件和连接的复杂查询,因此我想避免为了获得计数而执行两次查询。

根据 mysql docs我可以这样做:

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
-> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();

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

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.

所以有两个问题,我可以以某种方式强制我的交易来防止这种竞争条件吗?如果不是,是否有另一种方法可以在不再次执行查询并检索计数的情况下执行此操作?

最佳答案

当涉及到事务时,存在某些问题,不同的隔离级别或多或少地阻止了这些问题。我在我的回答中对此进行了描述 here .
例如,像幻读这样的问题可能会影响选择的结果,就像您正在做的那样,是的。但是 SQL_CALC_FOUND_ROWS 的结果会在查询完成后立即存储,并在您在同一 session 中执行另一个查询后立即丢失。这是重要的部分。 SQL_CALC_FOUND_ROWS 是 session 绑定(bind)。没有办法,另一个 session 中的另一个查询的结果存储在您当前的 session 中。 SQL_CALC_FOUND_ROWS 的使用不受竞争条件的限制。 SELECT 查询的结果,是的,但不是 FOUND_ROWS() 的结果。不要混淆这一点。

关于mysql - 如何防止 select found_rows 在竞争条件下中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46933132/

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