以下演示示例
if (someList.contains(fooObject)) {
someList.add(someObject);
someStorage.serialize(someObject);
}
我需要执行两项协调任务:将对象someObject
添加到someList
并将其序列化到存储someStorage
。我希望someList
和someStorage
具有一致的数据:两个操作都成功,或者如果其中一些操作失败,或者如果一个成功则回滚,但其他操作失败。怎么做?
答案 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
}
}