【发布时间】:2015-11-28 05:53:35
【问题描述】:
我有一个在线酒店预订系统,允许多个用户几乎同时进行预订。
当用户请求空闲房间时,系统会执行查询以获取空闲房间,然后以某种方式显示...
现在当用户点击“预订”按钮时,免费房间被发送到服务器进行预订,我正在使用与此非常相似的查询(这是简化的):
Insert into Bookings(room_id) select available_room_id from
dbo.GetAvailableRooms(@StartDate,@EndDate) where available_room_id = @ToBeBookedRoomID;
其中“GetAvailableRooms”是一个 UDF。
我希望通过此查询来测试最新时间是否有可用空间,但我担心这是否会受到竞争条件的影响?我正在考虑某些用户在插入和选择操作之间的时间内预订了该房间的情况......“插入..选择”会保证没有竞争条件吗?
更新: 这是函数sql查询:
select AllDays.day_date,alloted_room_id as available_room_id,pl.room_number from HotelsContractsAllotments hl
inner join PlansRooms pl on pl.room_id = hl.alloted_room_id
inner join HotelsContracts hc on hc.contract_id = hl.allotment_contract_id
inner join Hotels h on h.hotel_id = hc.contract_hotel_id
inner join AllDays on day_date >= hc.contract_starting_date and day_date <= hc.contract_end_date
left join BookingsRooms br on day_date >= br.booking_starting_date and day_date <= br.booking_end_date and br.booking_room_id = alloted_room_id
where br.booking_room_id is null and day_date >= @StartingDate and day_date <= @EndDate
谢谢。
【问题讨论】:
-
没有看到来自
dbo.GetAvailableRooms的代码,我希望这会暴露在竞争条件下.. -
对不起,我刚刚更新了,你能看看吗? @GordonLinoff
-
我建议使用事务。另请参阅:stackoverflow.com/questions/1071286/…