php - 如何在预订时屏蔽餐 table ?

标签 php mysql sql

如何阻止预订?我的预订表有 from_datetime 和 to_datetime 字段。我想避免两个用户同时预订某样东西的情况。

我的尝试:

终端 1: - user1

LOCK TABLE booking READ;
INSERT INTO booking VALUES ('2019-01-01 12:00:00', '2019-01-01 14:00:00');

现在 table booking 应该被锁定,其他用户应该不能从它读取,但是......

终端 2: - user2

SELECT * from booking 

我有结果...为什么?这应该被阻止,直到我在 TERMINAL 1 中这样做:

unlock tables;

最佳答案

您需要使用LOCK TABLE booking WRITE;。这表明您将要写入表,并且您需要阻止其他人读取和写入表。

READ 锁意味着您只能读取表。它阻止其他用户写入表,以便您的所有读取访问一致的表内容。但它不会阻止其他用户阅读表格。

但是,如果您使用的是 InnoDB,则应该使用事务而不是表锁。这是更细粒度的,并找出自动锁定的内容。您的代码看起来像这样:

START TRANSACTION;
SELECT COUNT(*) FROM booking
WHERE from_datetime = '2019-01-01 12:00:00' AND to_datetime = '2019-01-01 14:00:00'
FOR UPDATE;
-- If this returns zero count:
INSERT INTO booking VALUES ('2019-01-01 12:00:00', '2019-01-01 14:00:00');
COMMIT;

SELECT 中的FOR UPDATE 选项导致 MySQL 锁定表的适当部分。如果另一个用户执行相同的代码,如果他们尝试选择相同的时间,他们将被阻止。

关于php - 如何在预订时屏蔽餐 table ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56813520/

相关文章:

javascript - 通过一个独立的按钮提交两个表单的数据并插入数据到DB

php - 带复选框的多重搜索

MySQL 外键和引用

mysql - 选择非规范化的列到单独的记录中?

php - MySQL select语句给出错误

php - 如何限制命令行应用程序可以在 Linux Web 服务器上使用的资源

mysql - 恢复数据库转储时的信息架构错误

sql - ORA-00905 : missing keyword (copied from textbook)

php - 如何借助纬度和经度在 30 公里范围内找到位置

php - 使用实时更新将在线用户显示为绿色,将离线用户显示为灰色