транзакции (обычные, дебит / кредит), я хочу считать их балансы чтобы не было факапов.
Есть банальный способ – брать все дебиты и кредиты, суммировать (в общих чертах), получаем баланс. Минусы – тормозит, если много транзакций.
Есть еще более банальный способ – поле balance, которое обновляется при совершении каждой транзакции (как обновляется – вариантов много, но это не особо важно), но его как-то стремно использовать, потому что есть очень много мест, где что-то может пойти не так и просрать кучу денег.
Я хочу сделать третим способом (гибридным) – время от времени делать чекпоинты балансов каждого из пользователей (в фоновом режиме) и расчитывать баланс как баланс на время чекпоинта + сумма балансов по транзакциям пользователя, сделанным после чекпоинта. Вроде это сохраняет точность первого способа, но при этом сокращает количество затратных операций по агрегации транзакций на порядки (в зависимости от кол-ва транзакций пользователя в промежуток времени).
Звучит ли это разумно? Или есть какие-нибудь более адекватные способы решения проблемы?
> Вроде это сохраняет точность первого способа А, может, наоборот, добавляет "как-то стремно использовать" второго способа? ;) Лично я за триггер + SERIALIZABLE (чтоб не думать про "расхождения при каких-нибудь хитрых условиях").
Обсуждают сегодня