2010-08-03 48 views
0

我正在編寫一個GAE-Java + Objectify網站,它允許用戶使用唯一的URL創建自己的網頁。我一直無法找出一個明確的方法來確保當兩個用戶同時嘗試聲明相同的URL時,只有一個用戶獲得它。App Engine:在事務內創建對象

這正是我試圖避免的情況:

  • 用戶1做了檢查 - 其可用
  • 用戶2做了檢查 - 其可用
  • 同時,用戶1頁創建並存儲它。
  • 用戶2創建一個頁面,並覆蓋用戶1

如何解決這個GAE上的任何想法?

回答

1

爲什麼不直接在transaction中運行代碼?我不明白問題出在哪裏。你有沒有嘗試過並且有問題的樣品?

+0

不......我不是真的能夠測試這種情景。我不明白當用戶1和用戶2在他們自己的個人交易中運行時它將如何工作。 – 2010-08-03 19:11:02

+0

而且沒有涉及的實體組... – 2010-08-03 19:13:13

+0

即使您不認爲它們是實體組,也會涉及實體組。即使你沒有明確地把它放在一個實體組中,每個實體都隱含在一個實體組中。任何交易只能涉及一個實體組中的實體。 – 2010-08-04 00:38:21

0

發現在python docs更清楚的解釋:

試圖獲取模型種類與給定的鍵名的實體。如果它存在,get_or_insert()只是返回它。如果不存在,則創建,存儲和返回具有給定種類,名稱和kwds參數的新實體。 get和後續(可能的)放在事務中以確保原子性。這意味着get_or_insert()將永遠不會覆蓋現有實體,並且當且僅當沒有給定種類和名稱的實體存在時,纔會插入新實體。 換句話說,get_or_insert()相當於這個Python代碼:

def txn(): 
    entity = MyModel.get_by_key_name(key_name, parent=kwds.get('parent')) 
    if entity is None: 
    entity = MyModel(key_name=key_name, **kwds) 
    entity.put() 
    return entity 

return db.run_in_transaction(txn)