我认为您发现这很困难的原因是您的设计存在缺陷,但没有足够的信息来纠正它。我不确定您要为哪个患者提供床位,在下面我使用@PatientIdToGiveBed
来指定,如在您的示例中,您将为所有“患者”提供同一张床。您可能需要修改它以选择第一个“In Patient”,就像选择床一样。
事务需要有一个隔离级别,REPEATABLE READ
可以防止两个事务分配同一张床,如果你使用默认值READ COMMITTED
,两个事务可以选择同一张床。这样,aREAD LOCK
就被保留在选定的床上,直到交易完成。
您可以将下面的整个语句放入 SSMS 并运行以对其进行测试。
DECLARE @Bed TABLE (
b_ID INT,
Status_Avai_Occ VARCHAR(20)
)
DECLARE @Patient_Record TABLE (
Id INT,
Name VARCHAR(10),
b_ID INT
)
INSERT INTO @Bed VALUES (1, 'Available')
INSERT INTO @Bed VALUES (2, 'Available')
INSERT INTO @Bed VALUES (3, 'Available')
INSERT INTO @Patient_Record VALUES (1, 'Adam', NULL)
INSERT INTO @Patient_Record VALUES (2, 'Ben', NULL)
INSERT INTO @Patient_Record VALUES (3, 'Charles', NULL)
DECLARE @PatientIdToGiveBed INT = 1
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRANSACTION
DECLARE @Available_BID INT
SELECT TOP 1 @Available_BID = b_ID FROM @BED WHERE Status_Avai_Occ = 'Available' ORDER BY b_ID
IF @Available_BID IS NULL
BEGIN
Print 'No Beds Available'
COMMIT
RETURN
END
UPDATE @Patient_Record SET b_ID = @Available_BID WHERE Id = @PatientIdToGiveBed
UPDATE @Bed SET Status_Avai_Occ = 'Occupied' WHERE b_ID = @Available_BID
COMMIT
SELECT * FROM @Patient_Record
SELECT * FROM @Bed