簡體   English   中英

如何防止兩個用戶同時訪問MySQL表?

[英]How can I prevent two users from accessing MySQL table at the same time?

假設我有一個網站,當訪問時,顯示今天你的幸運字。 問題是每個單詞都可以只為一個人幸運,所以你需要快速訪問網站。 以下是帶有幸運字的示例表:

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

我的問題是:如何防止兩個(或更多)用戶同時訪問該表。 我假設每個用戶從現有表中讀取第一個lucky_word ,並且立即刪除所選單詞,因此它不會是下一個用戶的幸運單詞。 例如,我想避免將展示給多個訪客。

我應該使用適當的MySQL查詢或PHP代碼中的某些行或兩者來解決這個問題嗎?

您可以在事務中使用鎖定讀取 ; 例如,使用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();

在MySQL中,您可以鎖定表,以防止其他會話讀取和/或寫入表。 在WRITE鎖定的情況下,請求鎖定的第一個會話將保持該表直到它被釋放,然后第二個會話將獲取它直到解鎖,依此類推。 這樣,您可以確保沒有兩個會話同時訪問或操作相同的數據。

閱讀手冊中的所有相關內容:

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

如果在使用該特定單詞時更新了更新表的日期戳,怎么樣?

然后你可以使用以下偽sql ...

select word from words where lastdate <> [today];
update words set lastdate = today where word = [word];

我用於類似任務的快速方法:

1)使用un field:id - > INT AUTOINCREMENT創建一個表“unique_sequence”

 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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM