Google数据存储区事务不是按顺序执行的

时间:2016-10-20 14:27:21

标签: python google-app-engine google-cloud-datastore

我需要在具有可序列化隔离级别的事务中运行以下代码,根据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

我的代码出了什么问题?

0 个答案:

没有答案