проблема
                  
                  
                  Есть коллекция счетов
                  
                  
                  Есть операции пополнения и снятия средств
                  
                  
                  Причем могут выполняться с кучи разных потоков, могут обновлять один счёт, а могут разные
                  
                  
                  Так вот
                  
                  
                  Возникает проблема с валидностью данных при снятии средств. Для того, чтобы провести снятие, я должен узнать, что я снимаю не больше, чем осталось (не выпало за 0). Но при параллельном выполнении этой операции возникает проблема, что два потока одновременно получают одно и то же значение счёта и снятие проходит не верно(было 10 и в одну секунду приходит два снятия по 10, оба потока видят баланс - 10 и начниюат снимать, а остаётся -10)
                  
                  
                  Обычная блокировка потока здесь не подходит, ТК это сильная просадка по производительности (люди, работающие с другими счетами не смогут работать , ТК один счёт заблокирует поток)
                  
                  
                  Как поступить, кто что может посоветовать ?
                  
                  
                
Оптимистик локинг неа ?
Есть ConcurentHashMap который умеет блокироваться только по ключу, или в твоём случае по номеру счета. Но если это не просто тестовое задание, то все сложнее. Монга будет в кластере и твое приложение тоже. В банковском софте не вносят изменения в баланс счёта а записывают транзакции сколько пришло / ушло и на основании этого считают баланс
Атомики уже предлагали? Но это будет работать только в пределах одной jvm
CQRS попробуй, должно решить.
Обсуждают сегодня