Я столкнулся с проблемой, когда данные в моей базе данных возвращаются к старому состоянию. Я думаю, что я сузил проблему до этой ситуации.
Представьте себе последовательность двух покупок, происходящих следующим образом:
Теперь мы потеряли данные, потому что запись базы данных была перезаписана с частично устаревшей информацией.
Как я могу предотвратить это, используя PHP5 и libmemcached с постоянными соединениями? Я думаю, что я хочу, чтобы узел кэша вообще не переключался при сбое; он должен просто не читать и не записывать в этот узел, но не удалять его из пула, чтобы я не получал дубликаты записей.
Это увеличит нагрузку на мою базу данных на 1 / n (где n — общее количество узлов кеша), когда узел выйдет из строя, но это лучше, чем оказаться с противоречивыми данными.
К сожалению, я не могу понять, какие настройки мне следует изменить, чтобы получить такое поведение.
мне нравится контроль версий и оптимистичный подход к блокировке реализовано в доктрине ОРМ. Вы можете сделать то же самое. Это не увеличит нагрузку на вашу базу данных, но потребует некоторого рефакторинга.
По сути, вы добавляете номер версии во все кешируемые таблицы, меняете свой update
запрашивает увеличение версии version = version + 1
и добавить where version=$version
состояние (пожалуйста, обратите внимание $version
исходит от вашего php / memcache). Вам нужно будет проверить количество затронутых строк и сгенерировать исключение, если оно равно 0.
Вам решать, как справиться с таким исключением. Вы можете просто аннулировать кеш для этой записи и попросить пользователя повторно отправить форму, или вы можете попытаться объединить изменения. На этом этапе у вас есть устаревшие данные из кэша, обновления из пользовательского ввода и свежие данные из БД, поэтому единственный неустранимый случай — это когда у вас есть 3 разных значения для одного столбца.
Вы делаете проблему более сложной, простой подход должен просто пометить кэш как грязный и перестроить его, а не просто вернуть его в эксплуатацию с несогласованными данными на нем.