Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何防止select found_行在竞争条件下中断?_Mysql_Transactions - Fatal编程技术网

Mysql 如何防止select found_行在竞争条件下中断?

Mysql 如何防止select found_行在竞争条件下中断?,mysql,transactions,Mysql,Transactions,我必须运行一个有限制和偏移量的查询,并且我还需要生成分页的结果总数。这是一个复杂的查询,有很多条件和连接,因此我希望避免为了得到一个计数而进行两次查询 据我所知,我可以这样做: mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name -> WHERE id > 100 LIMIT 10; mysql> SELECT FOUND_ROWS(); 但当我一次收到数千个请求时会发生什么,最终会出现这样的情况: mysql&g

我必须运行一个有限制和偏移量的查询,并且我还需要生成分页的结果总数。这是一个复杂的查询,有很多条件和连接,因此我希望避免为了得到一个计数而进行两次查询

据我所知,我可以这样做:

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
我已经将查询封装在单独的事务中,但据我所知

所以有两个问题,我是否可以强制我的事务来防止这种竞争条件?
如果没有,是否有其他方法可以在不再次执行查询和检索计数的情况下执行此操作?

在事务方面存在某些问题,不同的隔离级别或多或少会阻止这些事务。我在回答中已经描述了这一点。
例如,幻影读取之类的问题可能会影响选择的结果,就像您正在进行选择一样,是的。但是SQL\u CALC\u FOUND\u行的结果会在查询完成后立即存储,并且在同一会话中执行另一个查询时会立即丢失。这是重要的部分。SQL\u CALC\u FOUND\u行是会话绑定的。无法将另一个会话中另一个查询的结果存储在当前会话中。SQL\u CALC\u FOUND\u行的使用不受竞争条件的限制。SELECT查询的结果是,但不是找到的行()的结果。别把这搞混了