На что влияет аннотация Transactional в Spring
1️⃣ Как кратко ответить
Аннотация @Transactional в Spring управляет транзакциями на уровне метода или класса, обеспечивая атомарность операций. Она определяет, когда начинать и завершать транзакцию, как обрабатывать исключения и управлять изоляцией и распространением транзакций.
2️⃣ Подробное объяснение темы
Аннотация @Transactional в Spring используется для управления транзакциями в приложениях. Транзакция — это последовательность операций, которые должны быть выполнены как единое целое. Если одна из операций не удается, все изменения, сделанные в рамках транзакции, должны быть отменены, чтобы сохранить целостность данных.
Зачем нужна аннотация @Transactional
- Атомарность: Обеспечивает, что все операции в транзакции выполняются как единое целое. Если одна операция не удается, все изменения откатываются.
- Изоляция: Управляет уровнем изоляции транзакции, определяя, как текущая транзакция видит изменения, сделанные другими транзакциями.
- Распространение: Определяет, как транзакция должна распространяться в методах, вызываемых внутри транзакции.
- Управление исключениями: Определяет, какие исключения должны привести к откату транзакции.
Пример использования
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, обеспечивающий надежность и целостность данных в приложениях.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться