【发布时间】: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