2013-07-23 4 views
0

У меня вопрос о counterCache, что документация не уточняет вообще. Проверяет ли counterCache условия гонки при обновлении значения поля?Имеет ли counterCache страдания от условий гонки?

Например, у нас есть реализация форума, и для каждого форума у ​​нас есть номер n тем, хранящихся через counterCache. Затем, если два пользователя используют модель почти в одно и то же время (достаточно, чтобы перекрывать их операции, а это означает, что, когда кто-то ее завершает, другой все равно будет использовать ее), и один создаст новую тему, а другую (предположим, что она может) удаляет другую тему, затем будет показывать точно n темы, а не n + 1 или n-1?

ответ

0

Независимо от того, какая операция закончится, это будет результат. Это очень маловероятно и, вероятно, технически невозможно, что операция происходит на то же самое время. Поэтому один из них идет первым. Затем также требуется время, необходимое для получения запроса сервером и браузером. Поэтому всякий раз, когда приходит следующий запрос на просмотр, вы получите то, что в этот момент было обновлено в базе данных.

При проверке кода вы также можете видеть, что код выполняет поиск ('count') вместо inc/декрементирует +/- один. http://api.cakephp.org/2.3/source-class-Model.html#1913-1981 Итак, кеш записывается после завершения предыдущего действия.

И, наконец, я действительно не беспокоюсь о том, если счет выключен +/- один на мгновение, особенно на форуме.

0

Я считаю, что это возможно, но не из-за Cake, а из-за нескольких операций SQL в не транзакционном поведении, а также от нескольких клиентов (пользователей) одновременно. Любое веб-приложение с картой или без нее будет страдать от таких ситуаций.

Я не очень разбираюсь в транзакциях SQL, но я уверен, что какая-то конфигурация транзакций предотвратит эту форму.

Как говорит бурзум, пример форума определенно не о чем беспокоиться.

Смежные вопросы