cross-group transaction error with only one entity

2019-05-21 05:48发布

I'm trying to execute the code below. Some times it works fine. But some times it does not work.

@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)

I'm getting the error:

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

So, my question is:

If I'm changing only one entity (models.Site) why am I getting a cross-group transaction error?

4条回答
甜甜的少女心
2楼-- · 2019-05-21 06:26

As mentioned in the logs: "Cross-group transaction need to be explicitly specified". Try specifying it by using

@db.transactional(xg=True)

Instead of:

@db.transactional
查看更多
Animai°情兽
3楼-- · 2019-05-21 06:29

I had the same issue. By stepping through the client code, I made the following two observations:

1) Setting a parent of (None) seems to still indicate a parent of that kind, even if there's no specific record elected as that parent.
2) Your transaction will include all ReferenceProperty properties as well.

Therefore, you should, theoretically, get the cross-group transaction exception if you haven't declared a parent (by either omitting or setting to (None)) on any of the kinds that you're affecting if there's at least two (because if you're using kind A and kind B, it looks like you're using two different entity groups, for A records and for B records), -as well as- any of the kinds referred-to by any ReferenceProperty properties.

To fix this, you must create, at least, a kind without any properties, that can be set as the parent of all of your previously no-parent records, as well as the parent of all ReferenceProperty properties that they declare.

If that's not sufficient, then set the flag for the cross-group transaction.

Also, the text of the exception, for me, was: "cross-groups transaction need to be explicitly specified" (plural "groups"). I have version 1.7.6 of the Python AppEngine client.

Please upvote this answer if it fits your scenario.

查看更多
Deceive 欺骗
4楼-- · 2019-05-21 06:35

Does this work if you specify parent=None in your get_by_key_name() query?

Essentially, in order to use a transaction, all entities in the transaction must share the same parent (ie you query using one parent, and create a new entity withe the same parent), or you must use a XG transaction. You're seeing a problem because you didn't specify a parent.

You may need to create artificial entities to behave as parents in order to do what you're trying to do.

查看更多
放我归山
5楼-- · 2019-05-21 06:42

A cross group transaction error refers to the entity groups being used, not the kind used (here Site).

When it occurs, it's because you are attempting a transaction on entities with different parents, hence putting them in different entity groups.

SHAMELESS PLUG:

You should stop using db and move your code to ndb, especially since it seems you're in the development phase.

查看更多
登录 后发表回答