(insert into ... select) 关于竞争条件的语句是否安全 - SQL 服务器?
Is (insert into ... select) statement safe about race conditions - SQL Server?
我有一个在线酒店预订系统,允许多个用户几乎同时进行预订。
当用户请求免费房间时,系统执行查询以获取免费房间,然后以某种方式显示...
现在,当用户点击 "book" 按钮时,免费房间会发送到服务器进行预订,我使用的查询与此非常相似(已简化):
Insert into Bookings(room_id) select available_room_id from
dbo.GetAvailableRooms(@StartDate,@EndDate) where available_room_id = @ToBeBookedRoomID;
其中“GetAvailableRooms”是一个 UDF。
我希望通过此查询做的是测试是否有可用房间的最新时间,但我担心这是否会受到竞争条件的影响?我正在考虑这样一种情况,即某些用户在插入和 select 操作之间预订了那个房间……"insert into .. select" 会保证没有竞争条件吗?
更新:
这是函数 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
谢谢。
查看 table(s) 上的锁定和使用的提示。根据提供的信息,我希望这对竞争条件是开放的(即 table 上没有维护锁)。您可以查看具有 SQL 命中或事务的设置锁。那里有一些讨论锁定的帖子。一个看起来与您的问题相关的示例是:
SQL Server Table Lock during bulk insert
如果不持续锁定从 SELECT
到 INSERT
影响的 table(s),是的,您会面临竞争条件。
注意 - 长时间锁定 table 会在不同程度上影响性能,具体取决于流量和锁定时间(如果有很多用户同时尝试预订,相差 1 秒可以变得重要)。因此,如果您确实锁定 table,我建议您花一些时间调整您的查询以提高性能。我不会对此多说,因为我没有关于您的数据的任何指标,也不知道您的索引。可能最好从简单地重新构建您的查询开始,首先点击最严格的 table。我假设这将是持有 alloted_room_id
的 table(传递 ID,以便它可以在 WHERE
子句中使用)。
我有一个在线酒店预订系统,允许多个用户几乎同时进行预订。
当用户请求免费房间时,系统执行查询以获取免费房间,然后以某种方式显示...
现在,当用户点击 "book" 按钮时,免费房间会发送到服务器进行预订,我使用的查询与此非常相似(已简化):
Insert into Bookings(room_id) select available_room_id from
dbo.GetAvailableRooms(@StartDate,@EndDate) where available_room_id = @ToBeBookedRoomID;
其中“GetAvailableRooms”是一个 UDF。
我希望通过此查询做的是测试是否有可用房间的最新时间,但我担心这是否会受到竞争条件的影响?我正在考虑这样一种情况,即某些用户在插入和 select 操作之间预订了那个房间……"insert into .. select" 会保证没有竞争条件吗?
更新: 这是函数 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
谢谢。
查看 table(s) 上的锁定和使用的提示。根据提供的信息,我希望这对竞争条件是开放的(即 table 上没有维护锁)。您可以查看具有 SQL 命中或事务的设置锁。那里有一些讨论锁定的帖子。一个看起来与您的问题相关的示例是: SQL Server Table Lock during bulk insert
如果不持续锁定从 SELECT
到 INSERT
影响的 table(s),是的,您会面临竞争条件。
注意 - 长时间锁定 table 会在不同程度上影响性能,具体取决于流量和锁定时间(如果有很多用户同时尝试预订,相差 1 秒可以变得重要)。因此,如果您确实锁定 table,我建议您花一些时间调整您的查询以提高性能。我不会对此多说,因为我没有关于您的数据的任何指标,也不知道您的索引。可能最好从简单地重新构建您的查询开始,首先点击最严格的 table。我假设这将是持有 alloted_room_id
的 table(传递 ID,以便它可以在 WHERE
子句中使用)。