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