新开发银行交易冲突
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)
两个并发请求(r1 和 r2)正在尝试修改事务中的 A 实例。 r1 想要更新(即 .put()
)实例的 prop_a
,r2 想要同时更新实例的 prop_b
(即同一实例的不同属性)。这会被视为碰撞吗?
类似地,如果 r1 和 r2 想要更新同一实例 A 的 list
属性 中的不同元素(例如 list[0]
和 list[1]
),这也会被@ndb.transactional
视为碰撞吗?
如果它是 A 类的同一个实体,那么两个事务都会发生冲突。
即使它们不是 A 类的同一个实体,那么两个事务仍然会发生冲突,除非这两个实例属于不同的实体组。
交易的冲突space是实体组。事务是否引用不同的属性无关紧要。他们是否修改列表 属性 的不同元素并不重要。他们修改的是同一个实体还是不同的实体并不重要。从冲突的角度来看,唯一重要的是交易是否属于同一实体组。
假设我有以下模型:
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)
两个并发请求(r1 和 r2)正在尝试修改事务中的 A 实例。 r1 想要更新(即
.put()
)实例的prop_a
,r2 想要同时更新实例的prop_b
(即同一实例的不同属性)。这会被视为碰撞吗?类似地,如果 r1 和 r2 想要更新同一实例 A 的
list
属性 中的不同元素(例如list[0]
和list[1]
),这也会被@ndb.transactional
视为碰撞吗?
如果它是 A 类的同一个实体,那么两个事务都会发生冲突。
即使它们不是 A 类的同一个实体,那么两个事务仍然会发生冲突,除非这两个实例属于不同的实体组。
交易的冲突space是实体组。事务是否引用不同的属性无关紧要。他们是否修改列表 属性 的不同元素并不重要。他们修改的是同一个实体还是不同的实体并不重要。从冲突的角度来看,唯一重要的是交易是否属于同一实体组。