Google应用引擎ndb:阻止使用相同的ID

时间:2014-10-06 11:36:28

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

我正在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并实际写入同一实体。

如何防止这种情况发生?

1 个答案:

答案 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