查找实体的事务 - 锁定该类型的所有实体?

时间:2010-04-29 04:52:17

标签: google-app-engine

阅读交易文档:

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

    ...

当执行上述事务时,它可能会阻止Account对象上的所有其他写入尝试?我想知道因为我想要一个用户注册来检查已经在使用的用户名或电子邮件:

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

答案 0 :(得分:1)

不,事务仅对实体组进行操作,即具有相同根实体的实体集。分组与实体Kind没有任何关系;实体的父母可以是任何类型。

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