0

我有一个带有检查约束的待定订单表,以防止人们订购我们没有库存的商品。这需要我创建一个计数器函数来决定插入是否可以发生。它一直有效,直到库存中剩下 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;
4

2 回答 2

1

数学关了。代替:

    IF @Total - @Active > 0 
        SET @Result = 1
    ELSE 
        SET @Result = 0  

它应该是:

    IF @Total - @Active > -1 
        SET @Result = 1
    ELSE 
        SET @Result = 0  

那是因为您的约束函数可以看到您尝试添加的行并对其进行计数。

于 2012-08-01T15:55:29.020 回答
0

是的,但你的 set@total 语句是矛盾的,你的代码中也有几个中断。

于 2012-08-01T15:48:50.210 回答