假设我有一个网站,当访问时,显示今天你的幸运字。问题是每个单词都可以只为一个人幸运,所以你需要快速访问网站。下面是一个带有幸运字的示例表:
+---------------------+
| lucky_word |
+---------------------+
| cat |
| moon |
| piano |
| yellow |
| money |
+---------------------+
我的问题是:如何防止两个(或多个)用户同时访问该表。我假设每个用户都从现有表中读取第一个 lucky_word ,并且所选单词会立即删除,因此它不会成为下一个用户的幸运单词。例如,我想避免将 cat 显示给多个访问者。
我应该使用适当的MySQL查询或PHP代码中的某些行来解决这个问题吗?
答案 0 :(得分:7)
您可以在locking read内使用transaction;例如,使用PDO:
$pdo = new PDO('mysql:charset=utf8;dbname='.DBNAME, USERNAME, PASSWORD);
$pdo->beginTransaction();
$word = $pdo->query('SELECT lucky_word FROM myTable LIMIT 1 FOR UPDATE')
->fetchColumn();
$pdo->prepare('DELETE FROM myTable WHERE lucky_word = ?')
->execute(array($word));
$pdo->commit();
答案 1 :(得分:0)
在MySQL中,您可以锁定表,以防止其他会话读取和/或写入表。在WRITE锁定的情况下,请求锁定的第一个会话将保持该表直到它被释放,然后第二个会话将获取它直到解锁,依此类推。这样,您可以确保没有两个会话同时访问或操作相同的数据。
阅读手册中的所有内容:
答案 2 :(得分:0)
如何在使用该特定单词时更新时间戳?
然后您可以使用以下伪sql ...
select word from words where lastdate <> [today];
update words set lastdate = today where word = [word];
答案 3 :(得分:0)
我用于类似任务的快速方法:
1)创建一个表&#34; unique_sequence&#34;只有un field:id - &gt; INT AUTOINCREMENT
CREATE TABLE `erd`.`unique_sequence` (
`id` INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`));
2)当用户到达网站时:
INSERT INTO unique_sequence VALUES();
SELECT word FROM lucky_word WHERE id = LAST_INSERT_ID();
由于LAST_INSERT_ID()生成的ID是基于每个连接在服务器中维护的,因此它应该是多用户安全的......
...所以我们可以确保每个新用户都会获得一个与lucky_word表中的ID匹配的唯一ID。