首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server,完全同时进行双插入,唯一性错误

SQL Server,完全同时进行双插入,唯一性错误
EN

Stack Overflow用户
提问于 2015-05-05 15:38:57
回答 1查看 162关注 0票数 1

当以下代码几乎同时被调用两次时,我将面临麻烦。

代码语言:javascript
复制
DECLARE @membershipIdReturn as uniqueidentifier=null
SELECT @membershipIdReturn = MembershipId 
FROM [Loyalty].[Membership] 
WITH (NOLOCK)
WHERE ContactId = @customerIdFront 
AND 
IsDeleted = 0

IF (@membershipIdReturn IS NULL)
  //InsertStatementHere

呼叫非常接近(大约是千分之一秒),因此第二个呼叫也进入if语句中。然后,一个单一的失败被提升,因为这是不应该发生的。

这个bug是因为(NOLOCK)吗?我需要它来处理交易问题。

有什么办法可以纠正这种行为吗?

谢谢艾尔

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-05 16:15:49

两种选择

1.使用唯一约束,然后将insert语句放入Try Catch块中。

代码语言:javascript
复制
ALTER TABLE [Loyalty].[Membership] 
ADD CONSTRAINT uc_ContactId_IsDeleted UNIQUE(ContactId, IsDeleted)

2.使用合并和可序列化提示。因此,select和insert之间不会有任何差距。

代码语言:javascript
复制
MERGE   [Loyalty].[Membership] WITH (SERIALIZABLE) as T 
USING   [Loyalty].[Membership] as S
ON      ContactId = @customerIdFront 
        AND IsDeleted = 0
WHEN NOT MATCHED THEN
INSERT (MemberName, MemberTel) values ('','');
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30057417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档