2014-09-16 1 views
0

Приведенный ниже код не работает для отката при возникновении каких-либо исключений при вставке записей в базу данных. Я использую фреймворк Spring 4 и аннотацию.Почему метод JDBCTEmplate.batchupdate (sql []) не откат в Spring4 с помощью аннотации @transaction?

*/Я использую ниже код для управления транзакциями, и он не откатится ни для какого исключения./

@Transactional(rollbackFor = RuntimeException.class) 
public boolean insertBatch(List<String> query) throws SQLException { 
    boolean flag= false; 
    try 
    { 
     JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); 

     String[] Sql= query.toArray(new String[query.size()]); 
     jdbcTemplate.batchUpdate(Sql); 

     flag=true; 

    }catch(DataAccessException e) 
    { 
     flag=false; 
     MessageResource.setMessages("Constraints Violation ! CSV data value not matched with database constraints "); 
     LOGGER.info("CSV file Data not expected as database table structure defination like constraint violation/Data Type lenght/NUll etc for same data value"); 
     LOGGER.error("Cause for error: "+ e.getRootCause().getMessage()); 
     LOGGER.debug("Details explain : "+ e.toString()); 
     throw new RuntimeException("Roll back operation"); 
     //transactionManager.rollback(status); 

    } 
     return flag; 


}** 
+2

Я бы использовал простой пустой '@ Transactional' и просто перестроил исключение (' DataAccessException' является 'RuntimeException'), также вы теряете контекст (поскольку вы игнорируете исходное исключение) , Затем вместо создания собственного 'JdbcTemplate' вы должны ввести один (или хотя бы создать его один экземпляр). Наконец, убедитесь, что вы используете базу данных, которая поддерживает транзакции MySQL с таблицами MyISAM, например, не поддерживает транзакции. Мне также интересно, как этот метод вызывается, как если бы это внутренний вызов метода, '@ Transactional' бесполезен. –

+0

Сэр, спасибо за предложение, но я не понимаю, что я здесь отсутствует. Просьба привести пример с помощью кода или модификации выше кода. Я буду вам очень благодарен. – user3656511

+0

Что вы не понимаете? –

ответ

1

Actullay answaer обеспечивается Сир, M.Deinum ниже:

Spring использует прокси для применения АОП это будет работать только для методов, вызываемых извне. Внутренние вызовы методов не проходят через прокси-сервер, следовательно, нет транзакций, и в зависимости от ваших запросов вы получаете один большой или несколько меньших коммитов. Убедитесь, что внешний метод (тот, который вызывается для начала всего) является транзакционным. - M. Deinum 14 часов назад

0
@Transactional(rollbackFor = RuntimeException.class) 

Это будет откатить только если RuntimeException или подкласс брошен из аннотированных методов. Если вы хотите, чтобы откатить для любого Exception (например, SQLException, что НЕRuntimeException), вы должны сделать:

@Transactional(rollbackFor = Exception.class) 

И если вы хотите попробовать откат к какой-либо ошибки, которые могут произойти

@Transactional(rollbackFor = Throwable.class) 

Увы, в этом последнем случае время выполнения может быть настолько нарушено, что даже откат не может завершиться.

+0

Спасибо за предложение. Я пробовал это, но все еще не работал в Exception.class. Какую вещь мне не хватает. Он вставляет 8 записей перед исключением и когда исключение возникает на 9-й записи, тогда он не будет откатываться для предыдущей вставленной записи, используя вышеприведенный код. – user3656511

Смежные вопросы