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

问题描述 投票:0回答:1

我有一个保存对象的方法,但我需要使用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时,不会保存发票。我需要保存它。

java transactions rollback jta
1个回答
0
投票

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

交易处理基于代理。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.