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

时间:2019-11-25 16:29:17

标签: java transactions rollback jta

我有一个保存对象的方法,但我需要使用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;
 }
}

当我抛出IllegalArgumentException时,未保存发票。我需要保存它。

1 个答案:

答案 0 :(得分:2)

注释私有方法,或者甚至是从同一类的另一个方法调用的公共方法,都无法进行注释。

事务处理基于代理。

仅当您在注入到当前bean中的另一个bean上调用事务方法时,才能启动事务,以便包装另一个bean的事务代理会拦截该调用并开始事务。

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