← Назад ко всем вопросам

На что влияет аннотация Transactional в Spring

1️⃣ Как кратко ответить

Аннотация @Transactional в Spring управляет транзакциями на уровне метода или класса, обеспечивая атомарность операций. Она определяет, когда начинать и завершать транзакцию, как обрабатывать исключения и управлять изоляцией и распространением транзакций.

2️⃣ Подробное объяснение темы

Аннотация @Transactional в Spring используется для управления транзакциями в приложениях. Транзакция — это последовательность операций, которые должны быть выполнены как единое целое. Если одна из операций не удается, все изменения, сделанные в рамках транзакции, должны быть отменены, чтобы сохранить целостность данных.

Зачем нужна аннотация @Transactional

  1. Атомарность: Обеспечивает, что все операции в транзакции выполняются как единое целое. Если одна операция не удается, все изменения откатываются.
  2. Изоляция: Управляет уровнем изоляции транзакции, определяя, как текущая транзакция видит изменения, сделанные другими транзакциями.
  3. Распространение: Определяет, как транзакция должна распространяться в методах, вызываемых внутри транзакции.
  4. Управление исключениями: Определяет, какие исключения должны привести к откату транзакции.

Пример использования

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
​
@Service
public class BankService {
​
    private final AccountRepository accountRepository;
​
    public BankService(AccountRepository accountRepository) {
        this.accountRepository = accountRepository;
    }
​
    @Transactional
    public void transferMoney(Long fromAccountId, Long toAccountId, Double amount) {
        // Получаем счет отправителя
        Account fromAccount = accountRepository.findById(fromAccountId);
        // Уменьшаем баланс отправителя
        fromAccount.debit(amount);
        // Сохраняем изменения
        accountRepository.save(fromAccount);
​
        // Получаем счет получателя
        Account toAccount = accountRepository.findById(toAccountId);
        // Увеличиваем баланс получателя
        toAccount.credit(amount);
        // Сохраняем изменения
        accountRepository.save(toAccount);
    }
}

Объяснение кода

  • @Transactional: Аннотация над методом transferMoney указывает, что этот метод должен выполняться в рамках транзакции. Если в процессе выполнения метода произойдет исключение, все изменения, сделанные в рамках этого метода, будут отменены.

  • accountRepository.findById(fromAccountId): Извлекает объект Account из базы данных для отправителя. Это начальная точка транзакции, где данные загружаются для последующих операций.

  • fromAccount.debit(amount): Уменьшает баланс отправителя. Это изменение будет частью транзакции.

  • accountRepository.save(fromAccount): Сохраняет изменения в базе данных. Однако, из-за транзакции, изменения не будут окончательно зафиксированы до успешного завершения метода.

  • accountRepository.findById(toAccountId): Извлекает объект Account для получателя.

  • toAccount.credit(amount): Увеличивает баланс получателя.

  • accountRepository.save(toAccount): Сохраняет изменения для получателя.

Как работает @Transactional

  • Начало транзакции: Перед выполнением метода Spring открывает новую транзакцию.
  • Выполнение операций: Все операции в методе выполняются в рамках этой транзакции.
  • Фиксация или откат: Если метод завершается успешно, транзакция фиксируется, и все изменения сохраняются в базе данных. Если возникает исключение, транзакция откатывается, и все изменения отменяются.

Распространение и изоляция

  • Распространение (Propagation): Определяет, как транзакция должна вести себя, если метод вызывается из другого метода, который уже находится в транзакции. Например, REQUIRED (по умолчанию) означает, что метод должен выполняться в существующей транзакции или создать новую, если ее нет.

  • Изоляция (Isolation): Определяет уровень изоляции транзакции, влияя на видимость изменений, сделанных другими транзакциями. Например, READ_COMMITTED позволяет видеть только те изменения, которые были зафиксированы другими транзакциями.

Аннотация @Transactional — это мощный инструмент для управления транзакциями в Spring, обеспечивающий надежность и целостность данных в приложениях.

Тема: Spring/Spring-экосистема
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки