交易传播。REQUIRES_NEW不起作用

时间:2018-11-23 13:33:30

标签: spring spring-boot transactions spring-data-jpa spring-transactions

我尝试将实体列表保存到Oracle Db。

@Transactional
public void save() {
//logick
for (QuittanceType quittanceType : quittance) {
       quittancesService.parseQuittance(quittanceType);
     }
//logick
  }

在每个步骤中,我都调用此方法:

@Transactional
@Override
public void parseQuittance(QuittanceType quittance) {
    try {

        //logick create payToChargeDb
        paymentToChargeService.saveAndFlush(payToChargeDb);

    } catch (Exception e) {
        log.warn("Ignore.", e);
    }
}

和方法

        @Override
        public PaymentsToCharge saveAndFlushIn(PaymentsToCharge paymentsToCharge) {
            return paymentToChargeRepository.saveAndFlush(paymentsToCharge);
        }

当我尝试保存具有约束的实体时,我的主要交易回滚并获得堆栈跟踪:

Caused by: java.sql.BatchUpdateException: ORA-02290: CHECK integrity constraint violated(MYDB.PAYMENTS_TO_CHARGE_CHK1)

但是我想不跳过成功实体并保存成功。我破坏了我的方法

@Transactional(propagation = Propagation.REQUIRES_NEW)

它看起来像这样:

@Transactional
@Override
public void parseQuittance(QuittanceType quittance) {
    try {

        //logick create payToChargeDb
        paymentToChargeService.saveAndFlushInNewTransaction(payToChargeDb);

    } catch (Exception e) {
        log.warn("Ignore.", e);
    }
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
    @Override
    public PaymentsToCharge saveAndFlushInNewTransaction(PaymentsToCharge paymentsToCharge) {
        return paymentToChargeRepository.saveAndFlush(paymentsToCharge);
    }

但是当我尝试保存带有约束的实体时,我没有得到异常,也没有进入catcj块。只需停止调试,应用程序即可继续工作。我没有任何错误。好像正在回滚

1 个答案:

答案 0 :(得分:1)

@Transactional创建的代理不会拦截对象内的调用。

  

在代理模式(默认)下,仅外部方法调用   通过代理进入的邮件被拦截。这意味着   自我调用(实际上是目标对象内的一种方法   目标对象的另一种方法)不会导致实际   运行时的事务,即使被调用的方法标记有   @交易。另外,必须完全初始化代理以提供   预期的行为,因此您不应该依赖此功能   初始化代码(即@PostConstruct)。

https://docs.spring.io/spring/docs/current/spring-framework-reference/data-access.html#transaction-declarative

同一文档r ecommends use of AspectJ if you want this behaviour