Re[2]: Сколько транзакций и записей в БД будет?
От: Aleksei_Lekomtsev  
Дата: 05.10.23 11:44
Оценка:
Здравствуйте, 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?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.