Как управлять двумя сервисными методами в одной большой транзакции? - PullRequest
0 голосов
/ 19 января 2019

У меня есть один метод с двумя другими методами: один для сохранения сущности в базе данных и один для обновления нескольких строк в одной таблице.Эти 2 метода помечены @Transactional в сервисах.Также основной метод, который содержит их оба, аннотирован @Transactional распространением REQUIRES_NEW.Проблема заключается в том, что если второй метод, который обновляет некоторые записи, завершился неудачей, метод save ранее не откатывается.Я хочу выполнить откат, если один из двух методов не работает.

Main method:
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    protected void updateFailedImsisForDelete(Date currentDate, Collection<Nto7433> failedGscsAtDelete) {
            Set<WmFailedDevice> failedDevices = new HashSet<>();
            WmFailedBatch wmFailedBatch = new WmFailedBatch(currentDate, BatchOperationType.DELETE);
            for (Nto7433 gsc : failedGscsAtDelete) {
                failedDevices.add(new WmFailedDevice(gsc.getIpAddress(), wmFailedBatch));
            }
            wmFailedBatch.setFailedDevices(failedDevices);

            WmFailedBatch returnedWmFailedBatch = wmFailedBatchService.save(wmFailedBatch);
            wmPushedImsiService.updateFailedDeleteImsisBatch(returnedWmFailedBatch.getId(), currentDate);
    }

Save method:
        @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public WmFailedBatch save(WmFailedBatch wmFailedBatch) {
        return wmFailedBatchRepository.save(wmFailedBatch);
    }

Update method:
@Query(value = "update TABLE wm_pushed_imsi set faileddeletebatchid = :batchid where expiredate < :expiredate and faileddeletebatchid is NULL ", nativeQuery = true)
    @Modifying
    void updateFailedDeleteImsisBatch(@Param("batchid") Long batchFailedDeleteId, @Param("expiredate") Date currentDate);

@Override
    @Transactional(propagation = Propagation.REQUIRED)
    public void updateFailedDeleteImsisBatch(Long batchFailedDeleteId, Date currentDate) {
        wmPushedImsiRepository.updateFailedDeleteImsisBatch(batchFailedDeleteId, currentDate);
    }

Так что в updateFailedImsisForDelete, если updateFailedDeleteImsisBatch не выполняется, сохранение перед выполнено, но я хочу откат

...