Встречается на собеседованиях • сегодня
Как обеспечить целостность данных при одновременном начислении баллов на счет и их списании без изменения уровней изоляции
Используйте механизм пессимистичной блокировки через synchronized или ReentrantLock для Java-приложений. В СУБД применяйте SELECT FOR UPDATE для строки счета перед операцией:
java
// Пример с synchronized
public synchronized void transfer(Account from, Account to, int amount) {
if (from.getBalance() >= amount) {
from.debit(amount);
to.credit(amount);
}
}
// Пример с JPA/Hibernate и FOR UPDATE
@Transactional
public void transfer(Long fromId, Long toId, int amount) {
Account from = entityManager.find(Account.class, fromId,
LockModeType.PESSIMISTIC_WRITE);
Account to = entityManager.find(Account.class, toId,
LockModeType.PESSIMISTIC_WRITE);
text
if (from.getBalance() >= amount) {
from.setBalance(from.getBalance() - amount);
to.setBalance(to.getBalance() + amount);
}}
text
Это гарантирует атомарность операций без изменения уровня изоляции. Для распределенных систем рассмотрите паттерн Saga.
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
офферы быстрее!
Попробовать бесплатно
Следующий вопрос
Это единственный вопрос по вашему фильтру
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы