我有一个保存对象的方法,但我需要使用API并保存其返回值。如果API返回为“未授权”,则我需要回滚事务,但我想保留返回。
例如
@Transactional
public Invoice createSale(SaleDTO saleDTO) {
this.dao.save(saleDTO);
Invoice invoice = this.send(saleDTO);
if (invoice.isAuthorized()) {
invoice.setSale(saleDTO);
return invoice;
} else {
throw new IllegalArgumentException();
}
}
@Transactional(Transactional.TxType.REQUIRES_NEW)
private Invoice send(SaleDTO saleDTO) {
Invoice invoice;
...
this.dao.save(invoice);
return invoice;
}
当我抛出IllegalArgumentException时,不会保存发票。我需要保存它。
注释私有方法,或者甚至是从同一类的另一个方法调用的公共方法,都无法工作。
交易处理基于代理。
仅当您在注入到当前bean中的另一个bean上调用事务方法时,才能启动事务,以便包装另一个bean的事务代理会拦截该调用并开始事务。
读取https://docs.spring.io/spring/docs/current/spring-framework-reference/data-access.html#tx-decl-explained。您似乎没有使用Spring,但是它在Java EE中的工作方式是相同的。