나는 사람들이 우리가 재고가없는 품목을 주문하는 것을 막기 위해 check 제약 조건을 가진 보류중인 주문 테이블을 가지고 있습니다. 삽입 기능의 사용 여부를 결정하는 카운터 기능을 만들어야했습니다. 인벤토리에 남아있는 항목이 하나있을 때까지 작동하며 항목이 재고가 없다는 메시지가 나타납니다. 더티 읽기 문제라고 생각했지만 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 테이블의 커밋되지 않은 데이터를 건너 뛸 것이라고 생각 했습니까? 검사 제약 조건에 대해 무시됩니까? –
*** 항상 *** 자신 만의 변경 사항을 볼 수 있습니다. 힌트가 그 영향을 미칠 수 있습니다. – RBarryYoung