交易找到一个实体 - 锁定该类型的所有实体?

问题描述:

读事务的文档:交易找到一个实体 - 锁定该类型的所有实体?

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(); 

,但上面会更加耗费时间,我认为,做一个更糟糕的瓶颈?我理解什么会正确发生?

感谢

否,仅成交的实体组工作,也就是说,该组具有相同根实体的实体。这个分组根本与Kind没有任何关系;一个实体的父代可以是任何类型。

默认情况下,您的所有实体都是根实体,这意味着每个实体都是一个实体组。除非您在创建新实体时明确设置了父实体,否则这是您将得到的行为。

+0

好吧我理解实体锁定,但在我查询所有用户对象以通过用户名或电子邮件地址查找匹配的情况下,系统是否必须阻止任何新的用户对象的写入才能给我一个正确的结果?否则,具有相同用户名/电子邮件的用户可以在我进行查询的同时创建? – user246114 2010-04-29 13:57:24

+0

不,查询不会阻止写入。数据存储除了密钥外,也不强制唯一性。没有办法确保2个实体不是使用相同的用户名或相同的电子邮件创建的,尽管您可以通过连接它们并将其用作key_name来确保没有创建两个相同的帐户。基本上,你只能选择一个实体类型的唯一值。 – geoffspear 2010-04-30 12:53:10