@Transactional(rollbackFor={Exception.class}) не отменяет транзакцию

У меня есть следующий фрагмент кода, в котором я использую аннотацию Spring @Transactional с шаблоном JDBC, и он не отменяет транзакцию. Я использовал случайные имена файлов и имя таблицы. Я пытаюсь удалить строку для идентификатора внешнего ключа, а затем вставить запись для того же идентификатора в таблицу базы данных с именем «данные». Но когда я тестировал, я вижу, что если во вставке есть ошибка, удаление не откатывается. Я довольно новичок в Spring, поэтому любая помощь будет оценена по достоинству.

TestService.java

   @Service
   public class TestService {

      @Autowired
      TestRepository testRepository;

      @Transactional(rollbackFor={Exception.class})
      public void insertData(List<Data> dataList, Integer fkId)
         throws Exception {
         testRepository.updateData(dataList, fkId);
         //do some other stuff
      }
 }

TestRepository.java

 @Respository
 public class TestRepository {

    @Autowired
    @Qualifier("dataJdbcTemplate")
    private NamedParameterJdbcTemplate dataJdbcTemplate;

    @Transactional(rollbackFor={Exception.class})
     public void updateData(List<Data> dataList, Integer fkId) 
        throws Exception {

         String deleteId = "DELETE FROM data where 
        fk_id = :fkId";

         dataJdbcTemplate.update(deleteId, new 
           MapSqlParameterSource("fkId", fkId));

         String sql = "INSERT INTO data(fk_id, column1, column2)"
            + " VALUES(:fkId, :column1, :column2)";

         SqlParameterSource[] batch = 
SqlParameterSourceUtils.createBatch(dataList.toArray());
    dataJdbcTemplate.batchUpdate(sql, batch);


 }

база данных.xml

    <tx:annotation-driven transaction-manager="transactionManager"/>
    <bean id="dataJdbcTemplate" 
      class="org.springframework.jdbc.core.namedparam.
      NamedParameterJdbcTemplate">
      <constructor-arg ref="dataSource"/>
    </bean>

person oneMoreDeveloper    schedule 21.05.2018    source источник


Ответы (1)


Вам следует попробовать включить распространение транзакций.

Вы можете прочитать больше здесь: https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/transaction.html#tx-propagation

person Amila    schedule 21.05.2018
comment
Я попытался добавить @Transactional(rollbackFor={Exception.class}, propagation=Propagation.REQUIRED) в метод репозитория, но не работает. - person oneMoreDeveloper; 22.05.2018