0

私が作成している Web サイトでは、ユーザーがサイト上で一意のサブドメインを持つことができます。gaz123.mywebsite.com。

サイトに登録するときにサブドメインを入力します。アカウント レコードを作成する前のコードで、選択したサブドメインがまだ存在しないことを確認します。これは、同じサブドメインを持つアカウントに対する単純なクエリです。これがゼロ カウントを返した場合は、続行して、そのサブドメインでアカウントを作成します。

2 つの 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 に答える