Реализовать хранение счет в банке

208
11 апреля 2018, 10:15

Конечно такого не будет, но как лучше всего можно сделать хранение счета в банке без использования БД только RAM в многопоточной среде, я так понимаю можно использовать AtomicInteger для хранения суммы, и гарантируется точное списание. Но как можно обеспечить атомарность, чтобы к примеру у одного пользователя списалось и записалось к второму следуя принципу согласованности и устойчивости. Хочется как в БД коммит был согласованный.

void process(Account from, Account to, int sum) {
    AtomicInteger fromAtomicInteger = from.getAmount();
    AtomicInteger toAtomicInteger = to.getAmount();
    toAtomicInteger.addAndGet(sum);
    // что если выключится компьютер, допустим данные сохраняется после выключения
    fromAtomicInteger.addAndGet(-sum);
}
Answer 1

... что если выключится компьютер, допустим данные сохраняется после выключения

Чтобы обеспечить устойчивость «как в СУБД» нужно вводить в программу понятие транзакции, хранить информацию о транзакциях в постоянной памяти (вести журнал транзакций), реализовывать логику отката/повторного выполнения.

Вариант решения: хранить блокировку в постоянной памяти. Далее псевдокод:

//создаем запись в журнале транзакций,
//которая хранится в постоянном хранилище:
//в базе данных, файловой системе и т.п.
Transaction transaction = bank.createTransaction(from, to);
...
//выполняем операции
...
//отмечаем транзакцию как завершенную
transaction.finish();

для простоты опустил обработку исключений.

Если выключится компьютер, то при следующем запуске приложение прочитает из журнала записи о незавершенных транзакциях и обработает их по мере необходимости: либо откатит, либо доведет до конца, либо сообщит пользователю о проблемах в данных.

Также для корректной работы приведенного кода потребуется реализовать надежную изоляцию транзакций. Например после этой строки:

toAtomicInteger.addAndGet(sum);

может выполнится другая транзакция, которая переведет деньги с измененного счета to на третий счет и успешно завершится. Если после этого произойдет ошибка, то безболезненно откатить текущую транзакцию уже не получится. Избежать подобного рода ошибок можно блокировкой счетов на время операции. Соответственно, такие блокировки также должны храниться в постоянной памяти.

СУБД как правило предоставляют встроенные механизмы управления транзакциями.

READ ALSO
Универсальный JMS клиент

Универсальный JMS клиент

Я пишу приложение spring-boot, которое должно получать и отправлять JMS-сообщенияАдрес, порт, логин и пароль для подключения к брокеру читаются...

213
Вывод результата в java netbeans

Вывод результата в java netbeans

Возможно очень глупый вопрос, но где мой вывод текста? Уже долго мучаюсь с этой мелочью)

228
Поиск библиотек для Android Studio (Java)

Поиск библиотек для Android Studio (Java)

Как новичок прошу помощи в таком срамном вопросе как поиск библиотек в интернете(не установка, а именно поиск)

318
Java Spring Boot: The selection cannot be run any server

Java Spring Boot: The selection cannot be run any server

Добрый день! Скачал проект с github: https://githubcom/spring-guides/tut-react-and-spring-data-rest/tree/master/basic

267