如何防止两个用户同时访问MySQL表?

时间:2015-03-26 22:28:12

标签: php mysql sql

假设我有一个网站,当访问时,显示今天你的幸运字。问题是每个单词都可以只为一个人幸运,所以你需要快速访问网站。下面是一个带有幸运字的示例表:

+---------------------+
| lucky_word          |
+---------------------+
| cat                 |
| moon                |
| piano               |
| yellow              |
| money               |
+---------------------+

我的问题是:如何防止两个(或多个)用户同时访问该表。我假设每个用户都从现有表中读取第一个 lucky_word ,并且所选单词会立即删除,因此它不会成为下一个用户的幸运单词。例如,我想避免将 cat 显示给多个访问者。

我应该使用适当的MySQL查询或PHP代码中的某些行来解决这个问题吗?

4 个答案:

答案 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锁定的情况下,请求锁定的第一个会话将保持该表直到它被释放,然后第二个会话将获取它直到解锁,依此类推。这样,您可以确保没有两个会话同时访问或操作相同的数据。

阅读手册中的所有内容:

https://dev.mysql.com/doc/refman/5.6/en/lock-tables.html

答案 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。