【问题标题】:NDB Transaction CollisionNDB 交易冲突
【发布时间】:2015-11-30 02:28:11
【问题描述】:

假设我有以下模型:

class B(ndb.Model):
    name   = ndb.StringProperty()

class A(ndb.Model):
    prop_a = ndb.StringProperty()
    prop_b = ndb.StringProperty()
    list   = ndb.StructuredProperty(B, repeated=True)
  1. 两个并发请求(r1 和 r2)正在尝试修改事务中的 A 实例。 r1 想要更新(即.put())实例的prop_a,r2 想要同时更新实例的prop_b(即同一实例的不同属性)。这会被视为碰撞吗?

  2. 类似地,如果 r1 和 r2 想要更新 A 的同一实例的 list 属性中的不同元素(例如,分别为 list[0]list[1]),这是否也会被视为碰撞@ndb.transactional?

【问题讨论】:

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


    【解决方案1】:

    如果是 A 类的同一个实体,那么两个事务就会发生冲突。

    即使它们不是 A 类的同一个实体,那么两个事务仍然会发生冲突,除非两个实例属于不同的实体组。

    交易的碰撞空间是实体组。事务是否引用不同的属性并不重要。他们是否修改列表属性的不同元素并不重要。它们是否修改相同的实体或不同的实体并不重要。从冲突的角度来看,唯一重要的是交易是否属于同一个实体组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-02
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 2016-07-19
      • 2016-01-13
      相关资源
      最近更新 更多