私は、制限とオフセットを持つクエリを実行する必要がありますまた、ページングを構築する結果の合計数が必要です。多くの条件と結合を持つ複雑なクエリですので、カウントを取得するために2回だけクエリを実行しないようにしたいと考えています。レースコンディションでselect found_rowsが壊れるのを防ぐには?
mysql docsによると、私はこれを行うことができます。
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
を:私は一度のリクエストの数千を取得していたときに
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
-> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();
をしかし、何が起こる、最終的にこの問題が発生したインスタンスが存在します
私はクエリを別々のトランザクションでカプセル化しましたが、私が理解する限りですthere's no guarantee it'll prevent this race condition.
したがって、私は何とかこの競合状態を防ぐために私の取引を強制することができますか? そうでない場合は、もう一度クエリを実行してカウントを取得しないでもう一度やり直す方法がありますか?