Sobes.tech
Senior
40

//Jsou dány dva beany. Při třetí iteraci v metodě m1 došlo k výjimce. Kolik záznamů bude v databázi? 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) { // Přidává záznam do tabulky } }

Společnosti byly požádány
IT OneIT One

Odpověď od AI

sobes.tech AI

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

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

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

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

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