如何回滚第一个事务而不回滚新事务?



>我有一个保存对象的方法,但我需要消耗一个 API 并保存它们的返回。如果 API 返回"未经授权",我需要回滚事务,但我想保留返回。

例如

@Resource
private SessionContext context;
@Transactional
public Invoice createSale(SaleDTO saleDTO) {
this.dao.save(saleDTO);
Send send = this.context.getBusinessObject(Send.class);
Invoice invoice = this.send.send(saleDTO);
if (invoice.isAuthorized()) {            
invoice.setSale(saleDTO);
return invoice;
} else {
throw new IllegalArgumentException();
}
}
public class Send implements Serializable {
@Transactional(Transactional.TxType.REQUIRES_NEW)
private Invoice send(SaleDTO saleDTO) {
Invoice invoice;
...
this.dao.save(invoice);
return invoice;
}
}

当我抛出非法参数异常时,发票没有保存。我需要保存它。

注释私有方法,甚至是从同一类的另一个方法调用的公共方法,都不起作用。

事务处理基于代理。

只有在另一个 Bean 上调用一个事务方法,注入到当前 Bean 中,以便包装另一个 Bean 的事务代理拦截调用并启动事务时,才能启动事务。

阅读 https://docs.spring.io/spring/docs/current/spring-framework-reference/data-access.html#tx-decl-explained。你似乎没有使用Spring,但它在Java EE中的工作方式是相同的。

最新更新