LINQ to SQL を使用する ASP.NET MVC 2 サイトを構築しています。私のサイトが DB にアクセスする場所の 1 つで、競合状態が発生する可能性があると思います。
DB アーキテクチャ
という名前の関連する DB テーブルの列の一部を次に示しますRevisions
。
- RevisionID - bigint、IDENTITY、PK
- PostID - bigint、
Posts
テーブルの FK から PK - EditNumber - 整数
- RevisionText - nvarchar(最大)
私のサイトでは、ユーザーは投稿を送信し、後で投稿を編集できます。元の投稿者以外のユーザーが投稿を編集できるため、1 つの投稿で複数の編集を同時に行うことができます。
投稿を送信すると、Posts
テーブル内のレコードが作成され、PostIDがレコードの ID に設定され、 RevisionTextが投稿テキストに設定され、EditNumberRevisions
が 1 に設定されたテーブル内のレコードが作成されます 。Posts
投稿を編集すると、Revisions
レコードのみが作成され、EditNumberは最新の編集番号よりも 1 大きい値に設定されます。
したがって、EditNumber列は、投稿が編集された回数を示します。
EditNumber のインクリメント
これらの関数を実装する上での課題は、EditNumber列をインクリメントすることです。その列をIDENTITYにすることはできないため、その値を手動で操作する必要があります。
新しいリビジョンに必要なEditNumberを決定するための LINQ クエリを次に示します。
using(var db = new DBDataContext())
{
var rev = new Revision();
rev.EditNumber = db.Revisions.Where(r => r.PostID == postID).Max(r => r.EditNumber) + 1;
// ... (fill other properties)
db.Revisions.InsertOnSubmit(rev);
db.SubmitChanges();
}
最大値を計算して増加させると、競合状態が発生する可能性があります。
その機能を実装するより良い方法はありますか?