在庫のないアイテムを注文できないようにするチェック制約付きの保留中の注文テーブルがあります。これにより、挿入が発生するかどうかを判断するカウンター関数を作成する必要がありました。在庫が 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;