试图防止内部事务回滚。如果内部事务响应未成功,则外部事务应回滚,但内部事务应保存数据。

@Transactional(rollbackFor=Exception.class, propagation=Propagation.REQUIRES_NEW)
private void test1(Account account) throws Exception {
    DOA.save(account);
    status = test2(account);
    if(status!='SUCCESS'){
        throw new Exception("api call failed");
    }
}
@Transactional(propagation=Propagation.MANDATORY)
private void test2(Account account) {
    response //API Call
    DOA.save(response);
    return response.status;
}

最佳答案

将内部事务方法配置为Propagation.REQUIRES_NEW,以便无论外部事务方法是否回滚,该方法完成时它将始终提交(即保存数据)。

另外,请确保外部方法不会自我调用内部方法,因为@Transactional在这种情况下不起作用(请参见docs中的方法可见性和@Transactional部分)。

它们应驻留在外部方法调用内部方法的bean的不同bean中:

@Service
public class Service1 {

    @Autowired
    private Service2 service2;

    @Transactional(rollbackFor=Exception.class)
    public void test1(Account account) throws Exception {
        DOA.save(account);
        status = service2.test2(account);
        if(status!='SUCCESS'){
            throw new Exception("Api call failed");
        }
    }
}

@Service
public class Service2{

    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public void test2(Account account) {
        response // API Call
        DOA.save(response);
        return response.status;
    }
}

10-02 07:05