Sql server 2008 r2 如何避免在几乎同时进行的SQL添加中出现重复行?

Sql server 2008 r2 如何避免在几乎同时进行的SQL添加中出现重复行?,sql-server-2008-r2,thread-safety,unique-constraint,razor-3,Sql Server 2008 R2,Thread Safety,Unique Constraint,Razor 3,我的Razor 3 web应用程序正在为同一个外键Id创建多行,当为同一Id输入多个输入时,我希望获得有关如何避免这种情况的帮助 SQL Server表存储关于另一个表中记录的数据(它是用户对某些事物给出的评级,其中还有一个用户表和一个可评级事物表,因此评级表具有用户的外键id、被评级事物的外键id和评级值)。当没有给出评级时,该用户id和对象id没有行 当用户对某件事进行评级时,代码会调用服务器,服务器会检查该用户之前是否对该事进行过评级,如果是,则会更新该行,如果不是,则会创建一个新行: /

我的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的工作就是自动神奇地解析插入,并希望使用最新的值

  • 我想我可以以某种方式(?)告诉这个例程锁定DB或变成单线程,这样就可以在允许执行对同一例程的下一次调用之前完成添加一行
我只是不知道要做的语法或UI/SQL步骤,尽管看了一些。我想我更喜欢线程锁解决方案,因为我是程序员而不是DB人员,所以我更喜欢代码的复杂性


谢谢你的帮助

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

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

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

好的,我一直在努力让异常处理程序工作。我现在遇到的问题是,即使我让我的异常处理程序做我想做的事情,当我再次保存更改时,显然违反约束的add仍然存在,我不知道如何撤销它。有人知道删除违规添加的语法以便我可以继续吗?