Google App Engine中的事务隔离有多宽?

时间:2011-10-14 09:45:17

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

在什么级别 - 在同一实体组的事务操作中发生锁定和冲突?在根?在一些普通的,足够广泛的父母?

我不清楚什么是交易的“实体组”。它始终是一个源自根实体的组(没有父级),还是有一种机制可以选择足够宽的组进行事务处理。

例如,当我有这样的模型结构时:

- School
  - Teacher
  - Class
    - Course
      - Lesson
      - Evaluation
    - Student
      - Guardian 
      - Grade
      - PresenceMarker
    - TextBook

我的交易操作是否始终将“实体组”称为源自学校级别的组(无论实际操作发生的级别如何),或者当我更新同一班级中的学生实体时,我只能与之碰撞在同一类实体下发生的其他交易操作。

换句话说,是否只有一个实体组从学校开始,或者是否存在源自层次结构中每个其他级别的子实体组?如果有子实体组,它们是否用于事务隔离?

更新

Sharding counters为另一个例子。如果所有分片都有共同的父级,分片是否会起作用?更新单个计数器分片会导致其他分片上的事务冲突更新吗?

2 个答案:

答案 0 :(得分:2)

App Engine中的事务发生在实体组级别。 (请参阅文档herehere

  

是否存在源自层次结构中每个其他级别的子实体组?

没有“子实体组”。每个实体都只有一个实体组,因为它有一个最终的祖先。在您的示例中,您的所有模型最终都属于学校组。

  

如果所有分片都有共同的父级,分片是否会起作用?

要使分片按预期工作,每个分片必须位于其自己的实体组中。如果查看示例代码,可以看到每个分片都在自己的组中。您还可以看到,虽然increment()方法使用事务,但get_count()却没有。增量仅影响一个组,而get_count则从多个组中获取数据。

注意:App Engine的最新版本允许跨群组交易,但这是特殊情况,并且组的定义没有改变。

答案 1 :(得分:0)

据我所知,文档GAE始终使用实体组树的根作为其日志,该日志管理锁和事务。