我有一个在线酒店预订系统,允许多个用户几乎同时进行预订。
当用户请求免费房间时,系统会执行查询以获取免费房间,然后以某种方式显示...
现在,当用户点击"书"按钮,免费房间被发送到服务器预订,我正在使用一个非常类似的查询(这是简化):
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
感谢。
答案 0 :(得分:2)
查看表格上的锁定和使用的提示。根据提供的信息,我希望这对竞争条件开放(即桌面上没有保持锁定)。您可以查看具有SQL命中或事务的设置锁。有一些讨论锁定的帖子。与您的问题相关的一个例子是: SQL Server Table Lock during bulk insert
如果没有连续锁定受SELECT
到INSERT
影响的牌桌,是的,您可以参加比赛。
注意 - 长时间锁定表会对性能产生不同程度的影响,具体取决于流量和时间锁定(如果很多用户试图同时预订,1秒差异可能会变得很大)。因此,如果您确实锁定了表,我建议花一些时间来调整查询的性能。我不会对此说太多,因为我没有关于您的数据的任何指标,或者知道您的索引。可能最好从简单地重构您的查询以首先命中最严格的表。我假设这将是持有alloted_room_id
的表(传递ID以便可以在WHERE
子句中使用。)