Информация об изменениях

Сообщение Re: Сколько транзакций и записей в БД будет? от 05.10.2023 11:36

Изменено 05.10.2023 11:37 vsb

Re: Сколько транзакций и записей в БД будет?
Здравствуйте, Aleksei_Lekomtsev, Вы писали:

A_L>Сколько транзакций и записей в БД будет?


Те, которые успели закоммититься — останутся. Остальные — нет. Отката уже закоммиченных вложенных транзакций не будет.

A_L>Есть несколько предположений:

A_L>1 Будет 4 транзакции
A_L>2 Будет 0 записей, так как при срабатывании SQLException оно пробросится во внешнюю транзакцию(storeAll) и так как там оно не отлавливается, то внешняя транзакция(storeAll) сделает rollback
A_L>3 Будет 2 записи(1, 2), так как вложенная транзакция(store) при i == 3 не сделает rollback так как по умолчанию — The checked exception does not trigger a rollback of the transaction и внешняя транзакция (storeAll) тоже не сделает rollback по такой же причине

A_L>П.C. Правильно я понимаю что для store нельзя использовать private модификатор, так как proxy объект(который создается из-за Transactional annotation) не сможет к этому методу обраться?(т.е. там не reflection?)


Твой код скорей всего вообще работать не будет. То бишь при вызове 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);
        }
    }


Ну или вынести метод store в отдельный класс.
Re: Сколько транзакций и записей в БД будет?
Здравствуйте, Aleksei_Lekomtsev, Вы писали:

A_L>Сколько транзакций и записей в БД будет?


Те, которые успели закоммититься — останутся. Остальные — нет. Отката уже закоммиченных вложенных транзакций не будет.

A_L>П.C. Правильно я понимаю что для store нельзя использовать private модификатор, так как proxy объект(который создается из-за Transactional annotation) не сможет к этому методу обраться?(т.е. там не reflection?)


Твой код скорей всего вообще работать не будет. То бишь при вызове 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);
        }
    }


Ну или вынести метод store в отдельный класс.