Здравствуйте, vsb, Вы писали:
vsb>Здравствуйте, Aleksei_Lekomtsev, Вы писали:
A_L>>Сколько транзакций и записей в БД будет?
vsb>Те, которые успели закоммититься — останутся. Остальные — нет. Отката уже закоммиченных вложенных транзакций не будет.
A_L>>П.C. Правильно я понимаю что для store нельзя использовать private модификатор, так как proxy объект(который создается из-за Transactional annotation) не сможет к этому методу обраться?(т.е. там не reflection?)
vsb>Твой код скорей всего вообще работать не будет. То бишь при вызове store эта аннотация не будет приниматься во внимание. Чтобы он работал, тебе надо сделать что-то вроде
vsb>vsb>@Component
vsb>public class Dao {
vsb> @Autowired Dao self;
vsb> @Transactional(propagation = Propagation.REQUIRES_NEW)
vsb> public void storeAll(List<Integer> list) throws Exception {
vsb> for (var i : list) {
vsb> self.store(i);
vsb> }
vsb> }
vsb>
vsb>Ну или вынести метод store в отдельный класс.
@Component
public class Dao {
@Autowired Dao self;
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void storeAll(List<Integer> list) throws Exception {
for (var i : list) {
self.store(i);
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void store(Integer i) throws Exception {
if (i == 3) {
throw new SQLException();
} else {
// добавить запись в таблицу
}
}
}
Т.е. если правильно понял при таком варианте — будет 4 транзакции(1 для storeAll и 3 для store) и 2 записи в БД — 1 и 2?
А rollback для транзакций не срабатывает потому что SQLException?