我正在Google App Engine上构建订单系统。
假设我有以下订单模型:
class Order(ndb.Model):
time: DateTimeProperty()
日期加上作为字符串的序列号用作一个实体的id:
today = str(datetime.datetime.now())[:10].replace('-','')
# Fetch today's orders
orders = Order.query(...).order(-Order.time).fetch(1)
if len(orders)==0: # No entities: today's first order
orderNum = today + '00001'
else:
orderNum = str(int(orders[0].key.id())+1)
order = Order(id=orderNum)
order.date = datetime.datetime.now()
order.put()
假设有多个职员,他们可以同时执行该程序。一个明显的问题是它们可能获得相同的orderNum
并实际写入同一实体。
如何防止这种情况发生?
答案 0 :(得分:1)
您可以使用类似于以下代码的内容。
@ndb.transactional(retries=3)
def create_order_if_not_exists(order):
exists = order.key.get()
if exists is not None:
raise Exception("Order already exists: ID=%s" % order.key.id())
order.put()
或者您可以使用模型的类方法get_or_insert()
来事务检索现有实体或创建新实体。详情请见here。