1

我的 Razor 3 Web 应用程序正在为同一个外键 Id 创建多行,当多个输入进入同一个 Id 时,我想帮助我避免这种情况。

SQL Server 表将有关记录的数据存储在另一个表中(它是用户对某些事物的评分,其中还有一个用户表和一个可评分事物表,因此评分表具有用户的外键 id,被评级事物的外键 ID 和评级值)。如果未给出评分,则该用户 ID 和事物 ID 没有对应的行。

当用户对某事物进行评分时,代码会调用服务器,服务器会检查该用户之前是否对该事物进行了评分,如果是,则更新该行,如果没有,则创建一个新行:

// Get the member's rating for the thing, or create it.
Member_Thing_Rating memPref = (from mip in _myEntities.Member_Thing_Rating
                               where mip.thingID == thingId
                               where mip.MemberID == memberId
                               select mip).FirstOrDefault();
if (memPref == null)
{
   memPref = new Member_Thing_Rating();
   memPref.MemberID = memberId;
   memPref.thingID = thingId;

   _myEntities.Member_Thing_Rating.AddObject(memPref);
}

这工作得很好,除非用户非常快速地为同一件事发送两个评级(这种情况经常发生),这会导致服务器创建两行,因为显然它是多线程的并且两个线程都没有看到现有的行,所以他们都创建一个新的。

那么......我怎样才能避免这种情况呢?

  • 我假设我可以以某种方式(?)告诉 SQL Server 做出一个约束,该约束的组合memberID应该thingID在这个表中是唯一的,然后 SQL Server 的工作就是自动解决插入问题,并希望使用最新的值。

或者

  • 我想我可以以某种方式(?)告诉这个例程锁定数据库或成为单线程,以便在允许执行对同一例程的下一次调用之前完成添加一行。

我只是不知道要执行的语法或 UI/SQL 步骤,尽管有点看。我认为我更喜欢线程锁解决方案,因为我比 DB 人更喜欢程序员,所以我更喜欢代码的复杂性。

谢谢你的帮助!

4

1 回答 1

2

您可以轻松地向 SQL Server 表添加唯一约束,以确保您的(memberID, thingID)列永远不会重复:

ALTER TABLE dbo.YourTableNameHere
ADD CONSTRAINT UQ_MemberID_ThingID UNIQUE(MemberID, ThingID)

现在,如果您的第二个连接尝试插入一行,其值(MemberID, ThingID)已经在表中,INSERT则将失败,您将获得一个可以处理的异常,例如为这些 ID 中的一个或两个获取新值。

于 2014-06-28T09:15:37.003 回答