Транзакционный откат для определенных вставок - PullRequest
0 голосов
/ 16 февраля 2019

Привет, есть требование, в котором я читаю один удар по файлу. Пример того, как файл выглядит

File.xls

id scode value1 value2 value3 ------ и так далее

0 acdss 12 6 14 ----- не исключение

1 acxx 0,14 5 12 ----- исключение - откат

2 cxsas 52,2 24 21 ---- без исключения

для каждой строки, я должен вставить / обновить данные в 3 разных таблицах после выполнения некоторой бизнес-логики

, поэтому моя вставка / обновление выполняется в цикле for и длякаждая строка.

Проблема в том, что при вставке / обновлении данных в базу данных возникает какая-либо исключительная ситуация для любой строки, я хочу откатить вставку из всех 3 таблиц для этой конкретной строки и продолжить вставку для остальной части строки.Как упоминалось в примере файла для идентификаторов 0 и 2, исключений не было, данные должны быть вставлены во все 3 таблицы, а для идентификатора 1 следует откатить всю вставку.Я использую jdbcTemplate для моей операции с БД. Ниже, если в примере кода, который я реализовал

    class writer {
    public void persistData() {
        // code to read file and created object for each table
        // size of file here is 3 so loop is running 3 times and table1Object
        // and table2Object and table3Object has rows to be inserted into
        // database table A,B,C
        for (int i = 0; i < 3; i++) {
            service.persistData(table1Object[i], table2Object[i], table3Oject[i]);

        }
    }
}

class service {
    @Transactional(propagation = Propagation.REQUIRED_NEW, readOnly = false)
    public void persistData(ob1,ob2,ob3){
        dao.insertionOrUpadteForTableA(ob1);
        dao.insertionOrUpadteForTableB(ob2);
        dao.insertionOrUpadteForTableC(ob3);

    }
}

с использованием этого подхода, вся транзакция получает откат, любой может подсказать мне, как этого добиться.

1 Ответ

0 голосов
/ 17 февраля 2019

Положите try / catch вокруг сервисного вызова, чтобы продолжить построчную обработку файла в persistData даже в случае ошибок транзакции:

public void persistData() {
    for (int i = 0; i < 3; i++) {
       try {
           service.persistData(table1Object[i], table2Object[i], table3Oject[i]);
       } catch (TransactionException ex) {
           // handle exception
       }
    }
}

TransactionException является RuntimeException из Spring Tx в контексте транзакций базы данных.

В вашем примере будет достаточно режима распространения транзакции по умолчанию REQUIRED.

class service {
    @Transactional(readOnly = false)
    public void persistData(ob1,ob2,ob3) {
        //...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...