新开发银行交易冲突

NDB Transaction Collision

假设我有以下模型:

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视为碰撞吗?

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

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

交易的冲突space是实体组。事务是否引用不同的属性无关紧要。他们是否修改列表 属性 的不同元素并不重要。他们修改的是同一个实体还是不同的实体并不重要。从冲突的角度来看,唯一重要的是交易是否属于同一实体组。