Конечно такого не будет, но как лучше всего можно сделать хранение счета в банке без использования БД только RAM в многопоточной среде, я так понимаю можно использовать AtomicInteger для хранения суммы, и гарантируется точное списание. Но как можно обеспечить атомарность, чтобы к примеру у одного пользователя списалось и записалось к второму следуя принципу согласованности и устойчивости. Хочется как в БД коммит был согласованный.
void process(Account from, Account to, int sum) {
AtomicInteger fromAtomicInteger = from.getAmount();
AtomicInteger toAtomicInteger = to.getAmount();
toAtomicInteger.addAndGet(sum);
// что если выключится компьютер, допустим данные сохраняется после выключения
fromAtomicInteger.addAndGet(-sum);
}
... что если выключится компьютер, допустим данные сохраняется после выключения
Чтобы обеспечить устойчивость «как в СУБД» нужно вводить в программу понятие транзакции, хранить информацию о транзакциях в постоянной памяти (вести журнал транзакций), реализовывать логику отката/повторного выполнения.
Вариант решения: хранить блокировку в постоянной памяти. Далее псевдокод:
//создаем запись в журнале транзакций,
//которая хранится в постоянном хранилище:
//в базе данных, файловой системе и т.п.
Transaction transaction = bank.createTransaction(from, to);
...
//выполняем операции
...
//отмечаем транзакцию как завершенную
transaction.finish();
для простоты опустил обработку исключений.
Если выключится компьютер, то при следующем запуске приложение прочитает из журнала записи о незавершенных транзакциях и обработает их по мере необходимости: либо откатит, либо доведет до конца, либо сообщит пользователю о проблемах в данных.
Также для корректной работы приведенного кода потребуется реализовать надежную изоляцию транзакций. Например после этой строки:
toAtomicInteger.addAndGet(sum);
может выполнится другая транзакция, которая переведет деньги с измененного счета to
на третий счет и успешно завершится. Если после этого произойдет ошибка, то безболезненно откатить текущую транзакцию уже не получится. Избежать подобного рода ошибок можно блокировкой счетов на время операции. Соответственно, такие блокировки также должны храниться в постоянной памяти.
СУБД как правило предоставляют встроенные механизмы управления транзакциями.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Я пишу приложение spring-boot, которое должно получать и отправлять JMS-сообщенияАдрес, порт, логин и пароль для подключения к брокеру читаются...
Возможно очень глупый вопрос, но где мой вывод текста? Уже долго мучаюсь с этой мелочью)
Как новичок прошу помощи в таком срамном вопросе как поиск библиотек в интернете(не установка, а именно поиск)
Добрый день! Скачал проект с github: https://githubcom/spring-guides/tut-react-and-spring-data-rest/tree/master/basic