Встречается на собеседованиях • сегодня

Как обеспечить целостность данных при одновременном начислении баллов на счет и их списании без изменения уровней изоляции

Используйте механизм пессимистичной блокировки через 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.
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы