Исключения в транзакциях
Исключения — важная часть управления транзакциями в Spring. Они влияют на поведение транзакции, определяя, будет ли она зафиксирована или откатана.
Влияние исключений на транзакции
Spring по умолчанию откатывает транзакцию при выбросе RuntimeException или Error. Однако, если выбрасывается Checked Exception, транзакция будет зафиксирована, если явно не указано иное.
Пример:
Управление rollback для Checked Exception
Если нужно, чтобы транзакция откатывалась при выбросе Checked Exception, можно использовать параметр rollbackFor аннотации @Transactional:
Исключения, при которых не происходит rollback
Иногда нужно исключить определенные исключения из списка тех, которые вызывают откат транзакции. Это можно сделать с помощью параметра noRollbackFor.
Пример:
Обработка исключений в методах с @Transactional
Важно помнить, что @Transactional работает только при вызове метода из другого бина или извне. Внутренние вызовы метода, содержащего аннотацию @Transactional, не будут иметь эффекта.
Пример:
Принудительный откат при исключении
Для явного указания отката транзакции, даже если исключение не требует этого, можно использовать TransactionAspectSupport:
#Java #Training #Spring #TransactionException
Исключения — важная часть управления транзакциями в 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