回滚失败情况的变化

时间:2012-08-04 02:07:16

标签: google-app-engine

我的情况是我们更新实体数据,然后根据某些类型的更新,我们也可以更新另一个实体。

在某些情况下,第二个条目中的更新可能由于某些原因而失败并抛出异常。

问题是如何处理这种情况,因为我们想要回滚在第一个实体中完成的更改。

我们无法将更新推迟到第一个条目,直到第二个条目更新。

在目前的情况下,如果发生这种情况,那么

一旦代码到达下面的块,那么它将提交第一个条目更改,即使第二个实体更新中存在失败。那么如何回滚?如果第二次实体更新失败,我认为不关闭persistentManager是不正确的选择。

finally {
            try {
                if (pm != null && pm.isClosed() == false )
                    pm.close();
            } catch (Exception e) {
                log.severe("Exception in finally of execute of updateDonor");
                log.severe("Exception class is :" + e.getClass().getName());
                log.severe("Exception is :" + e.getMessage());
                throw new Exception(e.getMessage()
                        + "Unable to close persistence manager");
            }
            log.info("end of updateDonor");
        }

1 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解您的情况,但是cross-group(XG)交易,它允许将交易应用于来自多个实体组的实体,是您正在寻找的?在this page上搜索'跨群组交易。使用XG事务,对事务所包含的实体的所有更改都会通过,或者不执行任何更改。