因此,我试图弄清楚如何避免种族条件。我有一个产品,您可以在其中预订有限的资源。
每个资源都有许多能力。在数据库表中使用的行数计算出一个名为booking_resources的行数,每个资源都有一个行。
在执行代码期间,我进行多个检查:
- 这个人可以访问
- 是给定时间表中可用的资源
- 是否可以预订选项验证
- 进行预订
"进行预订"时,将预订所需的资源插入到booking_resources表中。这使得具有Resource_ID生长的行数,这又将使下一个检查是在给定时间表中可用的资源。我的问题是我找不到有关在这种情况下该怎么做的任何文档。我应该在资源表中添加额外的列,并以这种方式锁定行?(我使用 Innodb (
我已经阅读了一些有关使用Select ...进行更新的信息。但是,在我的情况下,这是没有意义的,因为我不"缓存"行中的预订数。整个想法是,我拥有24/7全天候可用的资源,每个预订都具有其能力。它的容量可能为10(这意味着我可以同时使用10个人使用该资源(。这也意味着(从理论上(人民预订资源可以重叠,只要同时使用10个人。
希望我的问题能够了解我面临的问题,并希望你们有一个优雅的解决方案,可以防止我的应用程序过度预订。
数据结构:
预订:
id |Company_id |点|来自|到|价格|booking_data |booker_choises |dure_order_id_datetime(如果不是订单的一部分,则删除预订时(|创建|更新|删除
booking_resources:
id |booking_id |Resource_id |来自|到|点|创建|更新|删除
资源:
id |Company_id |名称|min_booking |max_bookings |min_points |max_points |创建|更新|删除
为了能够重现我提出的JavaScript的问题,该问题同时在两个不同的窗口中单击相同的按钮。这是通过使用settimeout计时器和单击事件(使用jQuery(来完成的。
<script>
function syncClick(selector,time_to_activate){
date = new Date();
if(date.getTime() >= time_to_activate){
console.log('clicked');
jQuery(selector).click();
} else {
setTimeout(function(){
console.log("diff:"+(date.getTime() - time_to_activate));
syncClick(selector,time_to_activate);
},1);
}
}
</script>
谢谢。/w
因此,用于以下情况:
USERA和USEB Check Booka周一可用。因此,它将在他们两者检查后显示"可用"。使用存储过程" sp_checkavail",该过程检查可用性。它在两种情况下都应返回真实。
现在,Usera要求在星期一预订,因此单击"书"。这本书将保留在星期一。
请求应该像这样:
call sp_CheckAvail(bookid, $date, available); //This function will check
//wheter the book is available at the moment
of the request
if available
BEGIN
insert into reservations(bookid, date)
values($book, $date); //This will write the reservation only if the book is available
END
select available as result;
库尔斯(Cource(的必须全部运行在交易中,因此,即使同一时刻单击链接,也只有一个客户将获得预订。
请理解我不能为您编写一个完整的查询。但是这样它将起作用。