【问题标题】:How to rollback the first transaction and not rollback the new transaction?如何回滚第一个事务而不回滚新事务?
【发布时间】:2019-11-25 16:29:17
【问题描述】:

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

【问题讨论】:

    标签: java transactions rollback jta


    【解决方案1】:

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

    事务处理基于代理。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 2019-02-09
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      相关资源
      最近更新 更多