php - 如何防止在线酒店预订中的竞争条件

标签 php mysql race-condition

我正在使用 PHP 和 MySQL 编写酒店预订软件。我几乎完成了它,但遇到了竞争条件问题。例如,只剩下一间标准房,当 2 位客人都选择它时,它显示他们都可以入住。当客人在付款前点击确认时,我尝试通过再次检查房间来修复它,但仍然存在问题。我也尝试过在任何人先点击确认时将房间状态设置为待处理,但如果客人决定不付款或只是关闭浏览器,我无法弄清楚如何将其更改回可用状态。我搜索了 SO 以寻找答案,但我并没有真正找到明确的答案。提前致谢

最佳答案

一种解决方案是向数据库中的表添加两列。一列是 session ID 或用户 ID 或任何被提供房间的用户。第二列是一个时间戳,指示该优惠何时到期。

然后,在您的应用中,仅显示保留列中时间戳已过期的房间。 (将初始时间戳设置为 0 以使其开始时已过期。)选择房间后,再次检查该列。如果那里有一个未过期的时间戳,用户会收到一条“抱歉,你太慢了”的消息。否则,将时间戳记为 future 15 分钟或其他时间,然后继续。

您经常在旅游网站和购票网站上看到类似这样的内容:“我们将为您再保留这些座位 14 分钟。请在那时完成交易,否则它将被释放等等。” "

关于php - 如何防止在线酒店预订中的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12832570/

相关文章:

php - SQL 查询中的显示不起作用

php - <a href= 中的 HTML 实体

c - pthread_barrier_wait 返回后,如何立即销毁屏障?

c++11 - 为什么 ThreadSanitizer 会报告这个无锁示例的竞争?

javascript - 使用Ajax从数据库中获取数据

php - SQLSTATE[42S22] : Column not found: 1054 Unknown column 'title' in 'field list' in Laravel 5. 4

php - 神秘错误:mysql_num_rows()期望参数1为资源

php - 使用 PHP/MySQL/Ajax 的队列表

php - 如何避免 mySQL 在 mysql_result 上出现错误?

c - USB 音频缓冲区溢出