GAE在根实体上请求XG事务

时间:2014-01-26 15:31:55

标签: java google-app-engine transactions

我正在尝试使用以下代码添加新的根实体:

    try {
        DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
        Key eventKey = datastore.allocateIds("Event", 1).getStart();
        String keyString = KeyFactory.keyToString(eventKey);

        //TransactionOptions options = TransactionOptions.Builder.withXG(true);
        Transaction txn = datastore.beginTransaction();
        Entity eventEntity = new Entity("Event", keyString);

        datastore.put(eventEntity);

        txn.commit();
    } catch (Exception e) {
        log.log(Level.SEVERE, e.getMessage(), e);
        throw new InternalServerErrorException(e);
    }

这是一个简单的事务数据存储区插入,根据documents假设工作 -

  

每个根实体属于一个单独的实体组,因此单个事务不能在多个根实体上创建或操作,除非它是XG事务

我的'事件'实体没有任何祖先我只在交易中处理它。但由于某种原因,我得到以下例外:

  

java.lang.IllegalArgumentException:需要显式指定跨组事务,请参阅TransactionOptions.Builder.withXGfound和Element {     类型:“事件”     id:4   }    和元素{     类型:“事件”     名称:“ahBldmVudHNmaW5kZXIyMDEzcgsLEgVFdmVudBgEDA”   }

这里有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您的代码对我有用。我将它粘贴到一个运行的简单应用程序的中间,运行它两次,它创建了两个“事件”实体,并没有抛出任何异常。您的应用程序在其他地方有问题。

答案 1 :(得分:0)

好的,问题是因为我在交易中调用了以下方法:

private boolean containsEvent(Key eventKey) {
    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
    boolean contains = true;
    try {
        if (eventKey == null) {
            return false;
        }

        Entity eventEntity = datastore.get(eventKey);
        if (eventEntity == null) {
            contains = false;
        }
    } catch (com.google.appengine.api.datastore.EntityNotFoundException e) {
        contains = false;
    }
    return contains;
}

此代码仅检查数据存储区中是否已存在此实体 显然,由于实体尚未提交,因此将其视为获取不同的根实体,从而使其成为XG操作。一旦我在交易之外移动此方法调用,一切正常。

相关问题