2

以下のコードを実行しようとしています。うまくいく場合もあります。しかし、うまくいかない場合もあります。

@db.transactional
def _add_data_to_site(self, key):
    site = models.Site.get_by_key_name('s:%s' % self.site_id)
    if not site:
        site = models.Site()

    if key not in site.data:
        site.data.append(key)
        site.put()
        memcache.delete_multi(['', ':0', ':1'], key_prefix='s%s' %                                                                       
            self.site_id)

エラーが発生します:

File "/base/data/home/apps/xxxxxxx/1-7-1.366398694339889874xxxxxxx.py", line 91, in _add_data_to_site
  site.put()
File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/db/__init__.py", line 1070, in put
  return datastore.Put(self._entity, **kwargs)
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py", line 579, in Put
  return PutAsync(entities, **kwargs).get_result()
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 604, in get_result
  return self.__get_result_hook(self)
File "/base/python_runtime/python_lib/versions/1/google/appengine/datastore/datastore_rpc.py", line 1569, in __put_hook
  self.check_rpc_success(rpc)
File "/base/python_runtime/python_lib/versions/1/google/appengine/datastore/datastore_rpc.py", line 1224, in check_rpc_success
  raise _ToDatastoreError(err)
BadRequestError: cross-group transaction need to be explicitly specified, see TransactionOptions.Builder.withXG

だから、私の質問は:

エンティティ ( models.Site) を 1 つだけ変更している場合、グループ間トランザクション エラーが発生するのはなぜですか?

4

4 に答える 4

1

get_by_key_name() クエリで parent=None を指定した場合、これは機能しますか?

基本的に、トランザクションを使用するには、トランザクション内のすべてのエンティティが同じ親を共有する (つまり、1 つの親を使用してクエリを実行し、同じ親を持つ新しいエンティティを作成する) か、XG トランザクションを使用する必要があります。親を指定していないため、問題が発生しています。

やろうとしていることを行うために、親として動作する人工エンティティを作成する必要がある場合があります。

于 2013-04-03T04:21:45.047 に答える