2015-05-05 30 views
1

當下面的代碼幾乎同時被調用兩次時,我遇到了麻煩。SQL Server,雙精度同時插入,唯一性錯誤

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語句中。然後一個單一性失敗就是解除,因爲這不應該發生。

錯誤是因爲(NOLOCK)?我需要它來解決交易問題。

有沒有解決此問題的方法?

由於鋁

+0

只是要清楚,你說 [[[選擇MembershipId FROM [忠誠]。[會員] WITH(NOLOCK)WHERE的ContactID = @customerIdFront請將isDeleted AND = 0]]] 不爲NULL ,但是你的IF語句在運行之後會變成真實的嗎? – Aushin

+0

這兩個語句幾乎同時運行。有了正常的行爲,只有第一次運行應該對if語句有效,第二次不應該是true,因爲第一次運行已經完成了。但由於呼叫彼此如此接近,所以兩次運行都會輸入if語句。謝謝,Al – AlForStack

回答

1

兩個選項

1.採用獨特的約束然後把你的INSERT語句在try catch塊

ALTER TABLE [Loyalty].[Membership] 
ADD CONSTRAINT uc_ContactId_IsDeleted UNIQUE(ContactId, IsDeleted) 

2.使用合併與序列化的提示。因此,選擇和插入之間不會有差距。

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 ('',''); 
+0

contactId和Isdeleted已經存在限制,這就是爲什麼unicity faillure是解除的原因。正如我對於Aushin所說的: \t 這兩個語句幾乎同時運行。有了正常的行爲,只有第一次運行應該對if語句有效,第二次不應該是true,因爲第一次運行已經完成了。但由於呼叫彼此如此接近,所以兩次運行都會輸入if語句。謝謝你的回答,我會嘗試第二種選擇(合併)。它會影響表演嗎?謝謝AL – AlForStack