Tôi có một yêu cầu để tạo một thủ tục được lưu trữ mô phỏng chuỗi TSQL. Đó là nó luôn cung cấp một giá trị nguyên khác biệt ngày càng tăng trên mỗi cuộc gọi. Ngoài ra, nếu một số nguyên được truyền vào, nó sẽ trả về giá trị đó nếu chưa bao giờ có kết quả lớn hơn hoặc số nguyên cao nhất tiếp theo khả dụng. Không cần phải nói có thể có nhiều khách hàng gọi SP này cùng một lúc.
Đưa ra một bảng MetaInfo với các cột MetaKey varchar (max) và MeatValueLong bigInt. Dự kiến hàng có MetaKey của 'Internal-ID-Last' sẽ chứa giá trị cao nhất được gán cuối cùng. Tôi đã tạo các thủ tục được lưu trữ sau đây:
CREATE PROCEDURE [dbo].[uspGetNextID]
(
@inID bigInt
)
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRANSACTION
UPDATE MetaInfo WITH (ROWLOCK)
SET MetaValueLong = CASE
WHEN ISNULL(MetaValueLong,0) > @inID THEN MetaValueLong+1
ELSE @inID+1
END
WHERE MetaKey = 'Internal-ID-Last'
SELECT MetaValueLong
FROM MetaInfo
WHERE MetaKey = 'Internal-ID-Last'
COMMIT TRANSACTION
END
Câu hỏi của tôi chỉ đơn giản là, thủ tục được lưu trữ này có hoạt động như mong đợi không (tất cả người gọi sẽ được chỉ định một kết quả duy nhất)?