Потому что beforeSave вызывается внутри методов update и insert у CActiveRecord, а у нас в переодпределенном save вызывается update метод, при этом указывается, какие поля изменились
Из очереди достается пачка с командами. Это массив. Вот как все они были выполнены — обработка завершена.
Про очередь писал в прошлом посте — habrahabr.ru/post/176497/
Там правда немного изменился уже принцип работы, но суть та же.
Смотри. Три команды, которые как-то изменяют поля пользователя
Обработчик запускает команды поочередно. Команды через реестр получают модель пользователя и изменяют поля.
Сохранение происходит в обработчике после обработки всех команд. При этом сохраняются все модели, которые были получены командами.
1) частота отправки будет опытным путем подбираться. К примеру 10 команд накопилось — скинули. Или раз в 5 минут.
2) Такое возможно. Уходим от такого с помощью тестов, которые покрывают логику приложения и снижают риск возникновения такой ситуации.
3) В бд логики никакой нет. Каких-либо связей между таблицами в самом бд не реализовано. Все довольно просто там.
А что за ХП?
Связка генерируется в момент создания user_id и сохраняется в таблицу, которая не шардируется. Потом из нее узнаем где лежит пользователь. Так что все ок :)
Тоже шардинг. Принцип тот же. Я получаю данные из кэша стандартными методами проекта, а внутри все разруливается и определяется с какого сервера тянуть.
Сделал так. В ExtActiveRecord добавил
/**
* Избавляет от model() в моделях
* return CActiveRecord
*/
public static function model() {
return parent::model(get_called_class());
}
и убрал в моделях (кроме базовых) метод model.
Такой вариант предлагали?
По первому пункту — вызывается в registry, так как у нас уже реализована работа с кэшем, а после получения данных из кэша не происходит afterFind
Про очередь писал в прошлом посте — habrahabr.ru/post/176497/
Там правда немного изменился уже принцип работы, но суть та же.
Обработчик запускает команды поочередно. Команды через реестр получают модель пользователя и изменяют поля.
Сохранение происходит в обработчике после обработки всех команд. При этом сохраняются все модели, которые были получены командами.
2) Такое возможно. Уходим от такого с помощью тестов, которые покрывают логику приложения и снижают риск возникновения такой ситуации.
3) В бд логики никакой нет. Каких-либо связей между таблицами в самом бд не реализовано. Все довольно просто там.
А что за ХП?