0

我正在Google App Engine上構建訂單系統。Google應用引擎ndb:禁止使用相同的ID

假設我有秩序的下列模式:

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

您可以使用類似於下面的代碼的東西。

@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

+0

太棒了!非常感謝。 – 2014-10-07 10:01:05