2
votes

I'm trying to get a transaction to work in AppEngine and I'm running into problems with entity groups. My code is a bit like this:

parent_obj = ClassA.all().get()

def txn():
  key_name = 'hash of something here'

  if not db.get(db.Key.from_path('ClassB', key_name, parent=parent_obj)):
    obj = ClassB(
      parent = parent_obj
    )
    obj.put()

db.run_in_transaction(txn)

...but I get the 'Cannot operate on different entity groups in a transaction' error. What I don't understand is that as far as I can see my transaction only operates on entities in the same group. Namely, line 6 queries with a 'parent' which is the same as the 'parent' which is set in line 8, so both queries are concerned with the same entity group.

I'm left to conclude that my understanding of entity groups is wrong. But how? I've read the docs several times and still don't see how what I'm doing is wrong.

Any ideas? Thanks!

1

1 Answers

2
votes

This is probably happening because parent_obj is None and you are not passing a key_name when creating ClassB. In this case, you have multiple entity groups (each entity with no ancestor is a separate group).

This would work if parent_obj is None or not:

parent_obj = ClassA.all().get()

def txn():
  key_name = 'hash of something here'

  if not db.get(db.Key.from_path('ClassB', key_name, parent=parent_obj)):
    obj = ClassB(
      key_name = key_name,
      parent = parent_obj
    )
    obj.put()

db.run_in_transaction(txn)