asp.net mvc を使用して Web サイトを作成しています。私はこのようなテーブルを持っています
Create Table Items(
[Id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Colname] [nvarchar](20) NOT NULL
//OTHER UNIMPORTANT COLS HERE
)
ALTER TABLE Items ADD CONSTRAINT UN_Colanme UNIQUE(Colname)
私の Web サイトから、新しいアイテムを作成したり、データベースから (エンティティ フレームワークを使用して) アイテムを選択したりすることがよくあります。これがC#でどのように見えるかです
var item = db.Items.FirstOrDefault(i => i.Colname == "foo");
if(item == null)
{
item = new Item("foo");
db.Items.Add(item);
}
//some stuff with item
db.SaveChanges();
2 つのリクエストが同時に受信され、両方が同じ colname でアイテムを作成しようとする場合があります。一意の制約により、データベースに不適切な値が格納されるのを防ぐことができますが、変更を保存しようとすると、制約に違反しているため例外がスローされます。
この例外をキャッチすることは、これを処理する通常の方法ですか? 上記の C# コードの代わりに、テーブルをロックし、許可されている場合にのみ新しい行を挿入し、その行を返すストアド プロシージャを作成した場合、パフォーマンスが向上するでしょうか? それは一般的に行われていますか?