【问题标题】:Transactional Propagation.REQUIRES_NEW not workTransactional Propagation.REQUIRES_NEW 不起作用
【发布时间】:2019-04-26 03:00:12
【问题描述】:

我尝试将实体列表保存到 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 块。只需停止工作调试,应用程序就会继续工作。我没有收到任何错误。并且好像正在发生回滚

【问题讨论】:

  • 您的saveAndFlushInNewTransaction 是否与parseQuittance 属于同一类?
  • 您是否尝试过从save()parseQuittance() 方法中删除@Transactional 注释并只保留在saveAndFlushInNewTransaction() 上?

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


【解决方案1】:

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

在代理模式下(默认),只有外部方法调用 通过代理进入的被拦截。这意味着 自调用(实际上,目标对象中的一个方法调用 目标对象的另一种方法)不会导致实际 即使调用的方法标记为 @事务。此外,代理必须完全初始化以提供 预期的行为,所以你不应该在你的 初始化代码(即@PostConstruct)。

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

相同的文档 recommends use of AspectJ if you want this behaviour

【讨论】:

  • quittancesService.parseQuittancepaymentToChargeService.saveAndFlush 显然它们属于不同的服务类,因此 @Transactional 注释应该可以工作。
  • OP 没有发布任何类结构。我认为投反对票是没有根据的,因为这种行为可能是“陷阱”,并且由于缺乏信息,这可能是答案。
  • 反对票不是我的。虽然不是很清楚,但有问题的方法属于不同的类(见我上面的评论),所以这个答案是基于一个错误的假设。
猜你喜欢
  • 1970-01-01
  • 2011-10-05
  • 2020-06-23
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
  • 2017-11-18
  • 2012-04-18
相关资源
最近更新 更多