Hardtransactions

Как работают транзакции в Spring?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

@Transactional — declarative transaction management. Spring создаёт proxy, открывает транзакцию перед методом, коммитит в конце, откатывает при unchecked exception.

@Service
public class TransferService {
    @Transactional(
        propagation = Propagation.REQUIRED,
        isolation  = Isolation.READ_COMMITTED,
        rollbackFor = Exception.class,   // откатывать ВСЕ exceptions
        timeout = 30,
        readOnly = false
    )
    public void transfer(Long from, Long to, BigDecimal amount) { /* ... */ }
}

Propagation: REQUIRED (default), REQUIRES_NEW, SUPPORTS, NOT_SUPPORTED, NEVER, MANDATORY, NESTED (savepoint).

Проблемы:

  • self-invocation — proxy не используется, транзакция не откроется;
  • rollback по умолчанию только на unchecked — нужно rollbackFor = Exception.class;
  • на private методе не работает (proxy не видит);
  • TransactionTemplate — programmatic; PlatformTransactionManager — для разных БД.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.