2010-04-29 72 views
1

讀事務的文檔:交易找到一個實體 - 鎖定該類型的所有實體?

http://code.google.com/appengine/docs/java/datastore/transactions.html

一個例子提供節目,以使對象的實例一種方法:當上述交易被執行

try { 
    tx.begin(); 

    Key k = KeyFactory.createKey("SalesAccount", id); 
    try { 
     account = pm.getObjectById(Employee.class, k); 
    } catch (JDOObjectNotFoundException e) { 
     account = new SalesAccount(); 
     account.setId(id); 
    } 

    ... 

,它可能會阻止所有帳戶對象上的其他寫入嘗試?我不知道,因爲我想有這些檢查已經在使用一個用戶名或電子郵件用戶註冊:

tx.begin(); 

"select from User where mUsername == str1 LIMIT 1"; 
if (count > 0) { 
    throw new Exception("username already in use!"); 
} 

"select from User where mEmail == str1 LIMIT 1"; 
if (count > 0) { 
    throw new Exception("email already in use!"); 
} 

pm.makePersistent(user(username, email)); // ok. 

tx.commit(); 

,但上面會更加耗費時間,我認爲,做一個更糟糕的瓶頸?我理解什麼會正確發生?

感謝

回答

1

否,僅成交的實體組工作,也就是說,該組具有相同根實體的實體。這個分組根本與Kind沒有任何關係;一個實體的父代可以是任何類型。

默認情況下,您的所有實體都是根實體,這意味着每個實體都是一個實體組。除非您在創建新實體時明確設置了父實體,否則這是您將得到的行爲。

+0

好吧我理解實體鎖定,但在我查詢所有用戶對象以通過用戶名或電子郵件地址查找匹配的情況下,系統是否必須阻止任何新的用戶對象的寫入才能給我一個正確的結果?否則,具有相同用戶名/電子郵件的用戶可以在我進行查詢的同時創建? – user246114 2010-04-29 13:57:24

+0

不,查詢不會阻止寫入。數據存儲除了密鑰外,也不強制唯一性。沒有辦法確保2個實體不是使用相同的用戶名或相同的電子郵件創建的,儘管您可以通過連接它們並將其用作key_name來確保沒有創建兩個相同的帳戶。基本上,你只能選擇一個實體類型的唯一值。 – geoffspear 2010-04-30 12:53:10

相關問題