3

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# コードの代わりに、テーブルをロックし、許可されている場合にのみ新しい行を挿入し、その行を返すストアド プロシージャを作成した場合、パフォーマンスが向上するでしょうか? それは一般的に行われていますか?

4

2 に答える 2

1

これを行うには多くの方法があります。このシナリオでは、例外をキャッチするのが最も安価だと思います。もう 1 つの方法は、トランザクションの分離レベルを、Serializable などのはるかに高いレベルに引き上げることです。

ただし、このシナリオでは、一意の制約違反をキャッチして続行します。プログラミングの用語で考えすぎると、この状況をダブルチェック ロックのように考えることができます。つまり、そこにないことを確認し、トランザクションに入り、そこにあることを確認してから、値を破棄して使用することができます。そこにあるもの。

于 2013-05-23T22:59:27.963 に答える
0

これが、多くの開発者が GUID または DB に割り当てられた Int を一意のキーとして使用する理由です。外部キーが合法的に割り当てられており、論理的な重複である場合は、実証したように DB 重複制約を使用するか、ペセミスティック ロックの使用を検討してください。SQL サーバーには、使用できるツールがあります。例とブログを検索

  • ガイドキーを使用
  • DB に割り当てられた Int をキーとして使用する
  • 列の制約を使用して例外をキャッチします(説明したように)
  • 悲観的ロックを使用する (SQL 組み込み機能など)

使い方は「SQL server sp_getapplock」で検索してみてください。

于 2013-05-23T23:49:02.680 に答える