我正在构建一个使用 LINQ to SQL 的 ASP.NET MVC 2 站点。在我的网站访问数据库的地方之一,我认为可能存在竞争条件。
数据库架构
以下是相关数据库表的一些列,名为Revisions
:
- RevisionID - bigint、IDENTITY、PK
- PostID - bigint, FK to PK of
Posts
table - EditNumber - 整数
- 修订文本- nvarchar(最大)
在我的网站上,用户可以提交帖子并稍后编辑帖子。原始发帖人以外的用户可以编辑帖子 - 因此可以同时对单个帖子进行多次编辑。
提交 Post 时,会在表中创建一条记录,并在Posts
表中创建一条记录,Revisions
其中PostID设置为记录的 ID Posts
,RevisionText设置为 Post 文本,EditNumber 设置为 1。
编辑帖子时,仅Revisions
创建一条记录,其中EditNumber设置为比最新编辑编号高 1。
因此,EditNumber列指的是帖子被编辑了多少次。
递增EditNumber
我在实现这些函数时看到的挑战是增加EditNumber列。由于该列不能是IDENTITY,我必须手动操作它的值。
这是我的 LINQ 查询,用于确定新修订版应具有的EditNumber :
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();
}
计算最大值并增加它可能会导致竞争条件。
有没有更好的方法来实现该功能?