//Даны два бина. При выполнении третьей итерации в методе m1 возникло исключение. Сколько записей будет в БД? 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) { // Добавляем запись в таблицу } }
Ответ от нейросети
sobes.tech AI
В данном примере метод m1 помечен аннотацией @Transactional, и внутри него вызывается метод m2, который тоже @Transactional.
По умолчанию в Spring транзакции вложенные не создаются, а используются текущие (Propagation.REQUIRED). Это значит, что вызов m2 происходит в рамках той же транзакции, что и m1.
Если на третьей итерации в m1 возникает исключение, то вся транзакция откатывается целиком, включая все вызовы m2, которые были до ошибки.
Следовательно, в базе данных не будет сохранено ни одной записи, так как транзакция не была зафиксирована (commit), а была откатана (rollback).
Если бы у m2 была другая политика распространения транзакции (например, REQUIRES_NEW), то каждая вставка фиксировалась бы отдельно, и в базе остались бы записи до ошибки. Но в данном коде этого не видно.