如何在预订时封锁餐桌?

时间:2019-06-28 21:55:35

标签: php mysql sql

如何阻止预订?我的预订表包含from_datetime和to_datetime字段。当两个用户同时预订某些东西时,我想避免这种情况。

我的尝试:

终端1:-用户1

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

现在应该锁定表预订,其他用户应该不能从表中读取信息,但是...

终端2:-用户2

SELECT * from booking 

我有结果...为什么?直到我在端子1中执行此操作为止,该功能都应被阻止。

unlock tables;

2 个答案:

答案 0 :(得分:3)

您需要使用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;

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

答案 1 :(得分:0)

在某些情况下,锁定表不是一个好主意。

您应该使用交易记录,如果范围重叠,请签入交易记录。

Check overlap of date ranges in MySQL

https://dev.mysql.com/doc/refman/8.0/en/commit.html