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

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

Изменено 05.10.2023 11:14 Aleksei_Lekomtsev

Сколько транзакций и записей в БД будет?
@Component
public class Dao {

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void storeAll(List<Integer> list) throws Exception {
        for (var i : list) {
            store(i);
        }
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void store(Integer i) throws Exception {
        if (i == 3) {
            throw new SQLException();
        } else {
            // добавить запись в таблицу
        }
    }
}


Есть несколько предположений:
1 Будет 4 транзакции
2 Будет 0 записей, так как при срабатывании SQLException оно пробросится во внешнюю транзакцию(storeAll) и так как там оно не отлавливается, то внешняя транзакция(storeAll) сделает rollback
3 Будет 2 записи(1, 2), так как вложенная транзакция(store) при i == 3 не сделает rollback так как по умолчанию — The checked exception does not trigger a rollback of the transaction и внешняя транзакция (storeAll) тоже не сделает rollback по такой же причине
Сколько транзакций и записей в БД будет?
@Component
public class Dao {

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void storeAll(List<Integer> list) throws Exception {
        for (var i : list) {
            store(i);
        }
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void store(Integer i) throws Exception {
        if (i == 3) {
            throw new SQLException();
        } else {
            // добавить запись в таблицу
        }
    }
}


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

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