Batch с откатом если ошибка
От: Аноним  
Дата: 03.11.12 07:23
Оценка:
Есть Spring проект, есть импорт данных:


                this.jdbcTemplate = new SimpleJdbcTemplate(dataSource);
        
                // очистка данных

        String sqlClear = "UPDATE item_repository SET quantity = ?";                                
        
        this.jdbcTemplate.update(sqlClear, 0);
        
                // импорт новых данных

        String sql = "UPDATE item_repository " +
                "SET price = ?, quantity = ?, barcode = ? WHERE id = ?";
        
        this.jdbcTemplate.batchUpdate(sql,list);


можно ли как то сделать это операции в транзакции? т.е. если произошла ошибка во второй операции, то восстанавливались бы данные.
Re: Batch с откатом если ошибка
От: vip_delete  
Дата: 03.11.12 20:51
Оценка:
Здравствуйте, Аноним, Вы писали:

>можно ли как то сделать это операции в транзакции?


можно:

Connection conn = null;
try {
  conn = dataSource.getConnection();
  conn.setAutoCommit(false);
  PreparedStatement ps1 = conn.prepareStatement("UPDATE item_repository SET quantity = ?");
  ps1.setInt(1, 0);
  ps1.execute();
  PreparedStatement ps2 = conn.prepareStatement("UPDATE item_repository SET price = ?, quantity = ?, barcode = ? WHERE id = ?");
  ...
  ps2.addBatch();
  ps2.executeBatch();
  conn.commit();
} finally {
  if (conn != null)
    conn.close();
}
Re: Batch с откатом если ошибка
От: sef  
Дата: 05.11.12 12:49
Оценка:
Здравствуйте, Аноним, Вы писали:

можно и средствами спринга. смотрите в сторону @Transactional. как-то так:

@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = MyException.class)
final void setBlaBla(){
    try {
      int anzahl = getSimpleJdbcTemplate().update(sql, new Object[] { verweis, anschriftschluessel });
      logger.info("anzahl = " + anzahl);
      if (anzahl != 1) {
          throw new MyException("xxx");         
      }
   } catch (DataAccessException e) {
      throw new MyException(e);
   }
}
Re[2]: Batch с откатом если ошибка
От: Аноним  
Дата: 06.11.12 08:03
Оценка:
Здравствуйте, sef, Вы писали:

sef>Здравствуйте, Аноним, Вы писали:


sef>можно и средствами спринга. смотрите в сторону @Transactional. как-то так:


sef>
sef>@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = MyException.class)
sef>final void setBlaBla(){
sef>


а как проверить что точно работает на этом методе транзакция, как такое протестировать красиво?
Re[3]: Batch с откатом если ошибка
От: Blazkowicz Россия  
Дата: 06.11.12 08:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>а как проверить что точно работает на этом методе транзакция, как такое протестировать красиво?

Исключение выбросить.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.