为了账号安全,请及时绑定邮箱和手机立即绑定

如何在预订时阻止桌子?

如何在预订时阻止桌子?

PHP
慕沐林林 2021-09-18 10:37:49
如何阻止桌子预订?我的预订表有 from_datetime 和 to_datetime 字段。我想避免两个用户同时预订东西的情况。我的尝试:终端 1: - 用户1LOCK TABLE booking READ;INSERT INTO booking VALUES ('2019-01-01 12:00:00', '2019-01-01 14:00:00');现在应该锁定预订表,其他用户应该无法读取它,但是......终端 2: - 用户2SELECT * from booking 我有结果……为什么?这应该被阻止,直到我在 TERMINAL 1 做:unlock tables;
查看完整描述

2 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

您需要使用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 锁定表的适当部分。如果另一个用户执行相同的代码,如果他们尝试选择相同的时间,则会被阻止。


查看完整回答
反对 回复 2021-09-18
?
弑天下

TA贡献1818条经验 获得超8个赞

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

如果范围重叠,您应该使用交易并检查您的交易。


查看完整回答
反对 回复 2021-09-18
  • 2 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信