Java for Beginner
672 subscribers
541 photos
155 videos
12 files
827 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Исключения в транзакциях

Исключения — важная часть управления транзакциями в Spring. Они влияют на поведение транзакции, определяя, будет ли она зафиксирована или откатана.

Влияние исключений на транзакции

Spring по умолчанию откатывает транзакцию при выбросе RuntimeException или Error. Однако, если выбрасывается Checked Exception, транзакция будет зафиксирована, если явно не указано иное.

Пример:
import org.springframework.transaction.annotation.Transactional;

@Transactional
public void processOrder(Long orderId) throws Exception {
// Обновление данных
updateOrder(orderId);

if (someCondition()) {
throw new Exception("Проверяемое исключение");
}
}

@Transactional
public void processPayment(Long paymentId) {
// Обновление платежа
updatePayment(paymentId);

if (someCondition()) {
throw new RuntimeException("Непроверяемое исключение");
}
}
В методе processOrder транзакция не будет откатана при выбросе Exception.
В методе processPayment транзакция будет откатана из-за RuntimeException.


Управление rollback для Checked Exception

Если нужно, чтобы транзакция откатывалась при выбросе Checked Exception, можно использовать параметр rollbackFor аннотации @Transactional:
import org.springframework.transaction.annotation.Transactional;

@Transactional(rollbackFor = Exception.class)
public void processOrder(Long orderId) throws Exception {
// Обновление данных
updateOrder(orderId);

if (someCondition()) {
throw new Exception("Проверяемое исключение");
}
}
Теперь транзакция откатится, даже если выброшено проверяемое исключение.


Исключения, при которых не происходит rollback

Иногда нужно исключить определенные исключения из списка тех, которые вызывают откат транзакции. Это можно сделать с помощью параметра noRollbackFor.

Пример:
@Transactional(noRollbackFor = IllegalArgumentException.class)
public void performOperation() {
// Код операции

if (someCondition()) {
throw new IllegalArgumentException("Некорректные данные");
}
}
В этом случае транзакция будет зафиксирована, даже если выбросить IllegalArgumentException.


Обработка исключений в методах с @Transactional

Важно помнить, что @Transactional работает только при вызове метода из другого бина или извне. Внутренние вызовы метода, содержащего аннотацию @Transactional, не будут иметь эффекта.

Пример:
@Service
public class ExampleService {

@Transactional
public void method1() {
// Операции в транзакции
method2(); // Не будет выполнено в рамках транзакции
}

@Transactional
public void method2() {
// Операции в транзакции
}
}


Принудительный откат при исключении

Для явного указания отката транзакции, даже если исключение не требует этого, можно использовать TransactionAspectSupport:
import org.springframework.transaction.interceptor.TransactionAspectSupport;

public void executeWithRollback() {
try {
// Код операции
} catch (Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
throw e;
}
}


#Java #Training #Spring #TransactionException