@ Транзакционный откат в цикле - PullRequest
0 голосов
/ 12 июня 2018

У меня возникла проблема с транзакцией отката при использовании @Transactional.У меня есть следующий код:

@Transactional
public class A{

    @Resource
    Object obj;

    public void insertMultiTable(){
        for(Item item:items){
            try{
                obj.insertTableA();
                obj.insertTableB();
            } catch(Exception e){
                // do somethings...
            }
        }
    }
}

Как вы можете видеть, я сделаю insertTableA и insertTableB, мой процесс будет успешным, когда оба завершатся.У меня был первый и второй раз это успех.Но в-третьих, insertTableB сгенерирует исключение, и я просто хочу откатить только этот цикл, когда первый и второй раз были вставлены в базу данных.Как я могу это сделать?Пожалуйста, помогите ...

1 Ответ

0 голосов
/ 12 июня 2018

Переместите вашу логику в другой сервис и отметьте ее @Transactional(propagation = Propagation.REQUIRES_NEW)

Это сделает каждую транзакцию цикла независимой.(IE: исключение броска третьего цикла будет только откатывать третий цикл, оставляя результат первого и второго цикла подтвержденным)

public class SubA {
    @Resource
    Object obj;

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void insert(Item i) {
           try{
                obj.insertTableA();
                obj.insertTableB();
            } catch(Exception e){
                // do somethings...
            }
    }
}

Теперь вызовите эту службу в вашем A классе

@Transactional
public class A{

    @Resource
    SubA subA;

    public void insertMultiTable(){
        for(Item item:items){
            subA.insert(item);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...