如何阻止桌子預訂?我的預訂表有 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 鎖定表的適當部分。如果另一個用戶執行相同的代碼,如果他們嘗試選擇相同的時間,則會被阻止。
- 2 回答
- 0 關注
- 160 瀏覽
添加回答
舉報
0/150
提交
取消
