我有一个带有检查约束的待定订单表,以防止人们订购我们没有库存的商品。这需要我创建一个计数器函数来决定插入是否可以发生。它一直有效,直到库存中剩下 1 件物品,然后我收到一条消息,我们的物品缺货。我认为这是一个脏读问题,但即使在插入 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;