Проблема с распространением (выбор права) в декларативной транзакции в Spring - PullRequest
0 голосов
/ 31 мая 2019

У меня есть вопрос о распространении в аннотации @Transactional.Мне нужно сделать две операции в одном методе, и каждая из них должна быть в собственной транзакции, после которой выполняется фиксация.

@Service
@Transactional
public class FakturaServiceImpl implements FakturaService {    

    @Override
    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public Integer przyjmijZaliczkeNaPodstPlatnosci(Integer platnoscId) { 

      Platnosc plat = Optional.ofNullable(platDao.findOne(platnoscId))
             .orElseThrow(() -> new RecordNotExistsException("Platnosc", platnoscId));

      // here should be beginning of transaction
      Integer faktId = utworzFaktureZaliczkowaNaPodstPlatnosci(plat);
      // commit
      // start new transaction
      rachotwMgr.dodajRachotwDlaZaliczekNaFakturze(faktId);
      // commit

      // ...
      return faktId;
    }

    @Override
    public Integer utworzFaktureZaliczkowaNaPodstPlatnosci(Platnosc plat) {
    // Here not starting new transaction, it's still Propagation.NOT_SUPPORTED
    rachotwMgr.naliczRachotwDlaRezerwacji(rezId, true); // this line is in new transaction
    // Continue in Propagation.NOT_SUPPORTED
    }
}

@Service
@Transactional
public class RachotwServiceImpl implements RachotwService {
    @Override
    @Transactional
    public List<Rachotw> dodajRachotwDlaZaliczekNaFakturze(@NotNull Integer fakturaId) {
    // Here starts new transaction..
    }
}

Является ли моя идея одним методом с Propagation.NOT_SUPPORTED и двумя методами с правом Propagation.REQUIRED(после того, как utworzFaktureZaliczkowaNaPodstPlatnosci () и dodajRachotwDlaZaliczekNaFakturze () следует совершить)?

1005 * Почему utworzFaktureZaliczkowaNaPodstPlatnosci (), который Propagation.REQUIRED (по умолчанию) не запускается новую транзакцию и dodajRachotwDlaZaliczekNaFakturze () и naliczRachotwDlaRezerwacji () начинает новую транзакцию,Как заставить utworzFaktureZaliczkowaNaPodstPlatnosci () начать новую транзакцию?

1 Ответ

1 голос
/ 31 мая 2019

Это довольно просто.По объявлению класса 'FakturaServiceImpl' метод utworzFaktureZaliczkowaNaPodstPlatnosci поддерживает транзакцию, но только если он будет вызван через объявление бина где-то еще:

@Inject
FakturaService service;


public void someMethod() {
   // Transaction will be here
   service.utworzFaktureZaliczkowaNaPodstPlatnosci(new Platnosc());
} 

Но вы делаете простой вызов метода, которого нетучаствует конфигурация транзакции.

@Override
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public Integer przyjmijZaliczkeNaPodstPlatnosci(Integer platnoscId) { 
  .....

  // Simple method call
  Integer faktId = utworzFaktureZaliczkowaNaPodstPlatnosci(plat);

  // ...
  return faktId;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...