Тут вот у нас давече вышел спор, хочется услышать мнения бывалых форумчан
Для начала опишу проблему, для тех, кто не в курсе:
Очень часто возникает необходимость показать пользователю часть данных, разбив их на страницы. Проблема, на первый взгляд тривиальная: посчитать сколько есть, и поделить на размер страницы, загрузив первую, и дальше грузить последующие. Проблема становится менее тривиальной в тот момент, когда приходит понимание, что "а черт, это ж два запроса к БД". Но потом как-то успокаиваешся, говоря себе - да ну и что, если сделать count да еще и по индексированому полю - это ж копеечная нагрузка.
Вторая стадия проблемы наступает (или не наступает?) тогда, когда понимаешь, что между тем, чтобы посчитать количество записей и выдать страницу может случится непоправимое - записи будут удалены. Но тут на помощь приходят АСИД транзакции, которые вроде как гарантируют, что такого не произойдет...
Далее, не смотря на то, что мы уже во всеоружии подготовились встретить проблему, мы понимаем, что транзакция не может закончится до того, как пользователь не перестанет разглядывать страницы (а то, опять же - другой пользователь удалил записи, и разбивка на страницы порушилась).
Итак, есть два подхода решения:
1. Сказать "да ну и будь, что будет, посчитаю, а там если удалят - ну так одна ошибка случится", или, другими словами, система может работать иногда некорректно, при условии, что большую часть времени система корректна.
2. Сказать "не, так оно никогда не взлетит: давайте не будем обещать пользователям того, что мы не можем получить в любой ситуации", или, другими словами, система не должна делать вид, что знает сколько еще страниц существует, а только разрешать посмотреть следующую страницу.