我需要在具有可序列化隔离级别的事务中运行以下代码,根据google datastore支持的文档:
class Test(ndb.Model):
child_ids = ndb.KeyProperty(repeated=True)
@classmethod
@ndb.transactional()
def add(cls, parent_id, child_id):
key = ndb.Key(cls, unicode(child_id.kind()), parent=parent_id)
# 1
x = key.get()
# 2
if x:
# 3
if child_id not in x.child_ids:
x.child_ids.append(child_id)
x.put()
else:
# 4
cls(key=key, child_ids=[child_id]).put()
“add”在两个不同的_post_put_hook中被调用两次,具有相同的parent_id和相同的child_id.kind()。
我期望发生的是,只有一个实体创建了2个child_id(或其中一个事务失败)。
相反,最后提交“wins”的事务和child_ids始终只有一个元素。事务最终运行交织在一起如下:
T1#1
T2#1
T1#2
T1#4
T2#2
T2#4 <-in a serializable transaction this should fail
我的代码出了什么问题?