Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 关于竞争条件的(insert into…select)语句是否安全-SQL Server?_Sql Server_Race Condition - Fatal编程技术网

Sql server 关于竞争条件的(insert into…select)语句是否安全-SQL Server?

Sql server 关于竞争条件的(insert into…select)语句是否安全-SQL Server?,sql-server,race-condition,Sql Server,Race Condition,我有一个在线酒店预订系统,允许多个用户几乎同时进行预订 当用户请求免费房间时,系统执行查询以获取免费房间,然后以某种方式显示 现在,当用户单击“book”(预订)按钮时,免费房间被发送到要预订的服务器,我使用的查询与此非常相似(简化): 其中“GetAvailableRooms”是一个自定义项 我希望通过这个查询来测试最近一次是否有空房,但我担心这是否会暴露在比赛条件下?我正在考虑这样一种情况,即一些用户在插入和选择操作之间预订了该房间。。。“插入..选择”会保证没有竞争条件吗 更新: 这是sq

我有一个在线酒店预订系统,允许多个用户几乎同时进行预订

当用户请求免费房间时,系统执行查询以获取免费房间,然后以某种方式显示

现在,当用户单击“book”(预订)按钮时,免费房间被发送到要预订的服务器,我使用的查询与此非常相似(简化):

其中“GetAvailableRooms”是一个自定义项

我希望通过这个查询来测试最近一次是否有空房,但我担心这是否会暴露在比赛条件下?我正在考虑这样一种情况,即一些用户在插入和选择操作之间预订了该房间。。。“插入..选择”会保证没有竞争条件吗

更新: 这是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
从HotelsContractsAllotments hl中选择AllDays.day\u date、Allocated\u room\u id作为可用的房间id、pl.room\u编号
内部连接平面在pl.room\U id=hl.ALLOCATED\U room\U id上打开pl
内部连接HotelContracts hc on hc.contract\u id=hl.allotation\u contract\u id
内部连接酒店h on h.hotel\u id=hc.contract\u hotel\u id

Internal join AllDays on day_date>=hc.contract_Start_date and day_date=br.booking_Start_date and day_date=@StartingDate and day_date查看表上的锁定和使用的提示。根据提供的信息,我预计这将对竞争条件开放(即表上未保持锁定)。您可以查看使用SQL命中或事务设置锁。有几个帖子讨论了锁定。与您的问题相关的一个例子是:

如果通过
插入操作
选择
,在受影响的表上没有连续锁定,则您将面临竞争条件


注意-长时间锁定表格将对性能产生不同程度的影响,具体取决于流量和锁定时间(如果许多用户同时尝试预订,1秒的差异可能会变得显著)。因此,如果您确实锁定了表,我建议您花一些时间调整查询的性能。我不会在这方面说太多,因为我没有关于您的数据的任何指标,也不知道您的索引。也许最好从简单地重新构造查询开始,首先命中限制最严格的表。我假设这将是存放
分配的\u房间\u id
(传递id以便可以在
WHERE
子句中使用)。

如果没有从
dbo.GetAvailableRooms
中看到代码,我希望这会暴露在比赛条件下。.对不起,我刚刚更新了它,你能看到吗@GordonLinoffI建议使用事务。还可以看到这一点:可能值得一看用于在线购物车之类的东西的模型,以及它们如何处理“保留”资源的分配,如果用户什么也不做,这些资源将过期。
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