我有一個檢查約束的掛單表,以防止人們訂購我們沒有庫存的物品。這要求我創建一個計數器函數來決定插入是否可以發生。它會一直運行,直到庫存中剩下1件商品,然後我收到一條消息,表明我們缺貨。我認爲這是一個骯髒的閱讀問題,但即使在引入ReadPast提示後,我仍然看到這種行爲。有沒有其他因素導致這個問題?或者我需要設置不同的隔離級別?ms sql server是否不在函數中使用ReadPast提示?
我已經試過用sprokID調用這個函數,它返回true,這就是爲什麼我在插入期間想到發生髒讀的原因。
ALTER TABLE [dbo].[PendingSprokOrders] WITH CHECK ADD CONSTRAINT [CK_SprokInStock] CHECK (([dbo].[SprokInStockCount]([SprokID])=(1)))
FUNCTION [dbo].[SprokInStockCount] (@SprokId INT)
RETURNS INT
AS
BEGIN
DECLARE @Active INT
SET @Active = (SELECT COUNT(*)
FROM [PendingSprokOrders] AS uac WITH(READPAST)
WHERE uac.SprokID = @SprokId
)
DECLARE @Total INT
SET @Total = (SELECT
ISNULL(InStock, 0)
FROM SprokInvetory
WHERE id = @SprokId
)
DECLARE @Result INT
IF @Total - @Active > 0
SET @Result = 1
ELSE
SET @Result = 0
RETURN @Result;
END;
我認爲WITH(READPAST)會跳過PendingSprokOrders表中未被取消的數據?檢查約束是否被忽略? – 2012-08-01 16:49:00
你可以***總是看到你自己的變化。沒有提示會影響到這一點。 – RBarryYoung 2012-08-01 16:49:50