Откат @Transactional не работает в приложении весенней загрузки? - PullRequest
0 голосов
/ 04 марта 2020

У меня есть требование, когда мне нужно вставить некоторые данные о сотрудниках в базу данных db2, и ниже приведен код для этого:

@Log4j2
@Service
@Transactional
public class EmployeeServiceImpl extends EmployeeService{

@Autowired
private EmployeeDataRepository employeeDataRepository;

@Override
@Transactional(rollbackOn = {DataAccessException.class})
public void insertEmployeeData(List<Employee> employeeList){
 try{
     employeeDataRepository.insertEmployeeData(employeeList);
    }catch(DataAccessException ex){
      log.error("Exception whie inserting data in db {}",ex.getMessage());
    }
}
@Log4j2
@Repository
public class EmployeeDataRepositoryImpl implements EmployeeDataRepository{

@Autowired
private DataSource dataSource;

@Value("${db.schema}")
private String schema;

@Override
public void insertEmployeeData(List<Employee> employeeList){
   this.jdbcInsert = new SimpleJdbcInsert(dataSource).withTableName("Employee");
   for(Employee emp : employeeList){
    Map<String,Object> parameters = new HashMap<String,Object>();
      parameters.put("name", emp.name);
      parameters.put("age", emp.age);
      parameters.put("dateOfJoining", emp.dateOfJoining);
      parameters.put("address", emp.address);
      parameters.put("salary", emp.salary);
      jdbcInsert.execute(parameters);
      log.info("Created Record Name = " + name + " Age = " + age + " dateOfJoining = "+dateOfJoining);
      }
      return;
}

} 

с использованием источника данных источника Spring. Источник данных настроен и введен в EmployeeDataRepositoryImpl класс. Я использую SimpleJdbcInsert для вставки данных в таблицу db2. Для транснациональной обработки я использую метод @Transactional(rollbackOn = {DataAccessException.class}) on. Когда данные вставляются одна за другой, то, если что-то идет не так на уровне базы данных, тогда они должны выполнить откат, но в конечном итоге этого не происходит. Также я попытался поместить аннотацию на уровне класса, но не повезло. Пожалуйста, дайте мне знать, если я что-то упустил?

Ответы [ 2 ]

3 голосов
/ 04 марта 2020

У вас здесь есть пара вещей.

  1. Спринг-ролл возвращает вашу транзакцию, если исключение (Runtime) всплывает через ваш метод @Transactional.
  2. Вы перехватываете исключение DataAccessException, следовательно, предотвращение отката.
  3. Также нет необходимости указывать исключение в rollbackOn.

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

@Transactional
public void insertEmployeeData(List<Employee> employeeList){
  employeeDataRepository.insertEmployeeData(employeeList);
}

Для получения дополнительной информации о том, как работает @Transactional, см. эту ссылку.

2 голосов
/ 04 марта 2020

Попробуйте rollBackFor вместо rollBackOn

Согласно приведенной ниже ссылке: https://github.com/spring-projects/spring-boot/issues/12709

...