2

我显然在某个地方错过了一些东西。

在某种程度上,客户在 11 秒的延迟(检查时间)内成功进行了两次预订。我的第一个想法是用户可能已经完成了预订,然后返回浏览器并再次完成了预订。然而,这是不可能的,因为我至少有 2 个验证,我知道这些验证会阻止这种行为。

留给我的唯一结论是,如果客户尝试提交预订,我们的网络服务在 11 秒内不知何故冻结,客户中止请求并再次提交,因此允许这两个预订同时发生。

除此之外,我不知道是什么原因造成的。MySQL插入延迟可能吗?

所以基本上我最想知道的是;
什么会导致表单提交并执行两次,而第二次绕过所有必需的验证?

我的表单的当前工作流程

用户在输入字段中提交数据,然后提交它们。我的系统验证所有这些输入并检查两个唯一代码,以确保它没有通过 MySQL 调用两次使用。它还确保可用座位数等于或大于预订的座位数。

在这种情况下,使用了相同的代码并且座位超出了允许的限制。

除非验证 POST,否则基本上不会将预订插入 MySQL。

4

2 回答 2

0

用户可以刷新处理表单的页面,从而发送两次 POST 信息?您的验证在哪里,如果它只是停止显示表单,而不是被处理,那么这可能是一种可能性吗?

于 2012-07-11T11:23:45.477 回答
0

我的系统验证所有这些输入并检查两个唯一代码,以确保它没有通过 MySQL 调用两次使用。

听起来你有一个并发问题。您在进行检查/插入时是否锁定表?

理论上,如果两个执行同时发生,它们都将具有唯一的 ID 并且在席位限制内,因此两个插入都将被允许继续(并因此成功)。

这是我在想什么的图解方式:

POST 1                  POST 2
Unique ID: 1234         Unique ID: 1234
Check if ID is present  Check if ID is present
ID is not present       ID is not present
Check if seats left     Check if seats left
Make insert             Make insert

POST 2在表解锁之前,不应允许第二个 make开始它的唯一 ID 检查,即POST 1完成它的插入。

于 2012-07-11T11:28:38.977 回答