0

私はSQL Server 2008で(または可能であればasp.net mvcから直接)ロックして簡単なことをしようとしていますが、それを処理する方法がよくわかりません。

テーブル(ユーザーと呼びます)があり、ユーザー名は一意でなければなりません。に沿って何かをしたい

var myuser = db.users.FirstOrDefault(u => u.username == username);
if(myuser == null)
{
  myuser = new user(username);
  db.users.add(myuser);
}
return myuser;

他の誰かが行った後にユーザー foo を挿入しようとすることがないように、それをアトミックにする必要があります。これがasp.net mvcから実装できれば完璧ですが、そうでない場合は、ストアドプロシージャで直接実行する必要があります。ストアド プロシージャでこれを行う正しい方法をロックしていますか? その場合、users テーブル全体をロックする必要がありますか? また、オンラインで検索すると、merge キーワードを使用したものを見たことがありますが、それが役立つかどうかはわかりません。

4

1 に答える 1

1

同時実行性が高い場合、FirstOrDefault 呼び出しと users.add 呼び出しの間に重複アカウントが作成される可能性があります

ユーザー名に一意のインデックスを追加すると、SQL は新しい行をブロックします。次に、コードでエラーをトラップします。

于 2013-05-22T22:31:52.880 に答える