用java协调变化

时间:2017-08-10 15:47:26

标签: java transactions java-8

以下演示示例

if (someList.contains(fooObject)) {
  someList.add(someObject);
  someStorage.serialize(someObject);
}

我需要执行两项协调任务:将对象someObject添加到someList并将其序列化到存储someStorage。我希望someListsomeStorage具有一致的数据:两个操作都成功,或者如果其中一些操作失败,或者如果一个成功则回滚,但其他操作失败。怎么做?

2 个答案:

答案 0 :(得分:2)

这样做的一种方法是采用两阶段提交(-ish)方法。因此,您重新构建了添加和序列化操作,以便执行最初可能失败的所有中间操作。然后将中间结果存储在变量中。在您验证了两个中间结果生成后,提交更改。

沿着这些方向的东西

if (someList.contains(fooObject)) {
  boolean r1 = someList.preAdd(someObject);
  boolean r2 = someStorage.preSerialize(someObject);
  if ( r1 && r2 ) {
    someList.commit();
    someStorage.commit();
  } else {
    if (!r1) someList.rollback()
    if (!r2) someStorage.rollback()
  }
}

根据实际界面,您可能希望使用try/catch而不是if/else

答案 1 :(得分:1)

if (someList.contains(fooObject)) {
  // we start with the operation which is easier to undo
  try{
    someList.add(someObject);
    //the first operation is succeded
    try{
      someStorage.serialize(someObject);
    }catch(Exception ex){
      // the second operation faild --> undo the first
      someList.remove(someObject);
      //report error
    }
  }catch(Exception ex){
    // the first operation faild -->   report error
  }  
}