当以下代码几乎同时被调用两次时,我将面临麻烦。
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)吗?我需要它来处理交易问题。
有什么办法可以纠正这种行为吗?
谢谢艾尔
发布于 2015-05-05 16:15:49
两种选择
1.使用唯一约束,然后将insert语句放入Try Catch块中。
ALTER TABLE [Loyalty].[Membership]
ADD CONSTRAINT uc_ContactId_IsDeleted UNIQUE(ContactId, IsDeleted)2.使用合并和可序列化提示。因此,select和insert之间不会有任何差距。
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 ('','');https://stackoverflow.com/questions/30057417
复制相似问题