Sobes.tech
Senior
52

// Podano dwa beany. Podczas trzeciej iteracji w metodzie m1 wystąpił wyjątek. Ile wpisów będzie w bazie danych? public class BeanA() { private BeanB b; @Transactional public void m1(List<Integer> list) { for (Integer i : list) { b.m2(i); } } } public class BeanB() { @Transactional public void m2(Integer i) { // Dodaje wpis do tabeli } }

Firmy, w których zadano pytania
IT OneIT One

Odpowiedź od AI

sobes.tech AI

В данном примере метод m1 помечен аннотацией @Transactional, и внутри него вызывается метод m2, который тоже @Transactional.

По умолчанию в Spring транзакции вложенные не создаются, а используются текущие (Propagation.REQUIRED). Это значит, что вызов m2 происходит в рамках той же транзакции, что и m1.

Если на третьей итерации в m1 возникает исключение, то вся транзакция откатывается целиком, включая все вызовы m2, которые были до ошибки.

Следовательно, в базе данных не будет сохранено ни одной записи, так как транзакция не была зафиксирована (commit), а была откатана (rollback).

Если бы у m2 была другая политика распространения транзакции (например, REQUIRES_NEW), то каждая вставка фиксировалась бы отдельно, и в базе остались бы записи до ошибки. Но в данном коде этого не видно.