【问题标题】:How wide is transaction isolation in Google App Engine?Google App Engine 中的事务隔离有多宽?
【发布时间】:2011-12-07 15:04:18
【问题描述】:

在同一实体组的事务操作中,锁定和冲突发生在哪里——在什么级别?在根?在某个常见的、足够广泛的父级上?

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

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

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

我的事务操作是否总是将“实体组”称为源自学校级别的组(无论实际操作发生在哪个级别),或者当我更新同一班级的学生实体时,我只能与在同一类实体下发生的其他事务操作。

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

更新:

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

【问题讨论】:

  • 虽然彼得的回答正确地说不同分片之间的事务不会发生冲突,但分片计数器的示例代码不处理分片内的冲突。我创建了一个项目来验证这一点并测量碰撞率。详情在这里:github.com/hrj/gae_tx_test

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    注意:最新版本的 App Engine 允许跨组事务,但这是一种特殊情况,组的定义没有改变。

    【讨论】:

      猜你喜欢
      • 2011-07-17
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多