mysql 如何回滚通过单个API调用的不同函数调用在不同表中执行的所有插入和更新

yruzcnhs  于 2023-02-03  发布在  Mysql
关注(0)|答案(1)|浏览(95)

我正在调用一个API来保存生产数据,我需要在不同的数据库中保存各种细节,如批号、机器编号和过程

Class ProductionImpl{

    public Long saveProduction(AddProduct addproduct){
    
        BatchData batchdata = batchDao.save(addproduct);
        \\
        ProductionPlane pp = productionPlanDao.save(addproduct,batchdata);
        MachineData machineData = new MachineData();
        machineData.setProductionId = pp.getId;
        \\
        saveMachine(machineData);
        return pp.getId;
    }
    \\
}

Class MachineImpl{

    public void saveMachine(machineData){
    
        ProductionPlane p_plan = productionPlanDao.findBy(machineDaata.getProductionId);
        \\
        MachineDao.save(machineData);
    }
    \\
}

如果saveMachine中发生错误,我还希望回滚saveProduction中的更改。

qv7cva1a

qv7cva1a1#

使用Saga pattern。下面是我使用temporal.io开源框架的方法:

public Long saveProduction(AddProduct addproduct){
    // Configure SAGA to run compensation activities in parallel
    Saga.Options sagaOptions = new Saga.Options.Builder().build();
    Saga saga = new Saga(sagaOptions);
    try {

        BatchData batchdata = batchActivity.save(addproduct);
        saga.addCompensation(batchActivity::undoSave, batchdata);

        ProductionPlane pp = productionPlanActivity.save(addproduct,batchdata);
        saga.addCompensation(productionPlanActivity::undoSave, pp);

        MachineData machineData = new MachineData();
        machineData.setProductionId = pp.getId;
        macnhineActivity.saveMachine(machineData);
        return pp.getId;
    } catch (ActivityFailure e) {
      saga.compensate();
      throw e;
    }
  }

相关问题