0

我正在创建的网站允许用户在网站上拥有一个唯一的子域,例如;gaz123.mywebsite.com。

他们在网站上注册时会进入他们的子域。在创建帐户记录之前的代码中,我检查他们选择的子域是否不存在。这只是对具有相同子域的帐户的简单查询。如果这返回零计数,那么我继续并使用该子域创建帐户。

我在两个 MongoDB 命令周围放置了一个 lock() 命令,即;检查子域是否可用,然后创建帐户。然后我松开锁。

lock( m_oLockMe)
{
    if( SubdomainIsFree( oRegisterModel.SubDomain))
    {
        CreateAccount( oRegisterModel);
    }
}

你会这样做吗?还有其他更好的方法吗?为什么?

谢谢

4

1 回答 1

3

这不是一个好方法——你在这里失去了可扩展性。我会用 atomic 来做这个findAndModify。首先,您需要在subdomain字段上建立唯一索引:

db.subdomains.ensureIndex({subdomain: 1}, {unique: true})

这是 upsert 不生成重复项所必需的。然后你会这样做:

r = db.subdomains.findAndModify({query: {used: false, subdomain: <subdomain>}, update: {$set: {used: true}}, new: true, upsert: true})

这将返回代表免费子域的文档或抛出重复键错误,这意味着使用了子域。对于免费子域,这也将自动设置used为,true因此保证只有一个findAndModify操作会获得相同的文档。

于 2011-02-03T09:34:41.917 回答