Spring声明式事务中的传播问题(选择权)

时间:2019-05-31 13:42:07

标签: java spring spring-boot transactions spring-transactions

我对@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()之后提交)?

为什么具有Propagation.REQUIRED(默认情况下)的utworzFaktureZaliczkowaNaPodstPlatnosci()不启动新交易,而dodajRachotwDlaZaliczekNaFakturze()和naliczRachotwDlaRezerwacji()开始新交易。如何使utworzFaktureZaliczkowaNaPodstPlatnosci()开始新交易?

1 个答案:

答案 0 :(得分:1)

这很简单。 通过'FakturaServiceImpl'类声明,方法utworzFaktureZaliczkowaNaPodstPlatnosci确实支持事务,但前提是它将通过其他地方的bean声明来调用它:

@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;
}