Sql server 2008 r2 如何避免在几乎同时进行的SQL添加中出现重复行?
我的Razor 3 web应用程序正在为同一个外键Id创建多行,当为同一Id输入多个输入时,我希望获得有关如何避免这种情况的帮助 SQL Server表存储关于另一个表中记录的数据(它是用户对某些事物给出的评级,其中还有一个用户表和一个可评级事物表,因此评级表具有用户的外键id、被评级事物的外键id和评级值)。当没有给出评级时,该用户id和对象id没有行 当用户对某件事进行评级时,代码会调用服务器,服务器会检查该用户之前是否对该事进行过评级,如果是,则会更新该行,如果不是,则会创建一个新行: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没有行 当用户对某件事进行评级时,代码会调用服务器,服务器会检查该用户之前是否对该事进行过评级,如果是,则会更新该行,如果不是,则会创建一个新行: /
// 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
的组合在这个表中应该是唯一的,然后SQL Server的工作就是自动神奇地解析插入,并希望使用最新的值thingID
- 我想我可以以某种方式(?)告诉这个例程锁定DB或变成单线程,这样就可以在允许执行对同一例程的下一次调用之前完成添加一行
谢谢你的帮助 您可以轻松地向SQL Server表中添加唯一约束,以确保在
(memberID,thingID)
列中永远不会出现重复项:
ALTER TABLE dbo.YourTableNameHere
ADD CONSTRAINT UQ_MemberID_ThingID UNIQUE(MemberID, ThingID)
现在,如果您的第二个连接尝试插入一行,其中包含表中已有的
(MemberID,ThingID)
值,那么插入将失败,您将得到一个可以处理的异常,例如,为其中一个或两个ID获取新值。好的,我一直在努力让异常处理程序工作。我现在遇到的问题是,即使我让我的异常处理程序做我想做的事情,当我再次保存更改时,显然违反约束的add仍然存在,我不知道如何撤销它。有人知道删除违规添加的语法以便我可以继续吗?