事务传播.REQUIRES_NEW不起作用



我尝试将实体列表保存到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);
}

当我尝试用约束保存实体时,我的主事务回滚,并且我得到了stacktrace:

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块。只要停止调试,应用程序就会继续工作。我没有任何错误。并且好像回滚正在发生

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

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

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

如果您想要这种行为,相同的文档建议使用AspectJ。

最新更新