Пакетная вставка и транзакция ActiveJDBC

Каков рекомендуемый способ вставки пакета записей или ничего, если база данных выдает ошибку для любой из вставок? Вот мой текущий код:

PreparedStatement ps = Base.startBatch("INSERT INTO table(col1) VALUES(?)");
for (MyModel m : myModels)
    Base.addBatch(ps, m.getCol1());
Base.executeBatch(ps);
ps.close();

Это вставляет записи до тех пор, пока не выйдет первая из них (если это произойдет).
Я хочу, чтобы все или ничего не было вставлено, тогда я подумал об обертке executeBatch():

Base.openTransaction();
Base.executeBatch(ps);
Base.commitTransaction();

Если это правильно, должен ли я сделать Base.rollbackTransaction() в каком-то try catch?
Должен ли я также закрыть ps.close() в блоке finally?

Спасибо!


person Maxime Laval    schedule 17.09.2015    source источник


Ответы (1)


Транзакционные пакетные операции ничем не отличаются от непакетных операций. Пожалуйста, посмотрите это: http://javalite.io/transactions#transacted-activejdbc-example по типовому образцу.

Вы сделаете это тогда:

List<Person> myModels = new ArrayList<>();
    try{
        Base.openTransaction();
        PreparedStatement ps = Base.startBatch("INSERT INTO table(col1) VALUES(?)");
        for (Person m : myModels){
            Base.addBatch(ps, m.getCol1());
        }
        Base.executeBatch(ps);
        ps.close();
        Base.commitTransaction();
    }catch(Exception e){
        Base.rollbackTransaction();
    }

Таким образом, ваши данные остаются нетронутыми в случае исключений.

person ipolevoy    schedule 17.09.2015
comment
Но в вашем примере ps.close() не будет достигнуто, если есть исключение, это нормально? - person Maxime Laval; 18.09.2015
comment
конечно, это просто псевдокод. Вам понадобится блок finally для закрытия ресурсов, включая соединение - person ipolevoy; 18.09.2015