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