gpt4 book ai didi

php - 我的查询是否锁定该行以供下次使用

转载 作者:搜寻专家 更新时间:2023-10-30 20:22:57 25 4
gpt4 key购买 nike

这是我在 php 中的代码结构:

function myfunction(){

try{
// begin Transaction

// get last row by this query:
// SELECT id FROM tableName WHERE t_date+INTERVAL 1 MINUTE< NOW() LIMIT 1
// store the returned id inside $id if exists, $id=0 otherwise (out of id for now)

// update the row to the current time to show it is fetched now by this query:
// UPDATE tableNAME SET t_date=NOW() WHERE id=$id

// end of Transaction
// commit

}catch (PDOException $e){
// failed, rollback
$id = 0;
}

return $id
}

如你所见,我的函数:

  1. 使用事务来锁定行。
  2. 返回最近 1 分钟内未返回的唯一行 ID。
  3. 请求的用户拥有该 ID 1 分钟。
  4. 其他用户可以在 1 分钟后拥有该 ID。

代码工作没有任何问题,我没有任何与代码结构相关的问题。

问题

如您所见,每个请求的 ID 应该始终是唯一的。我正在使用 MySQL 并且想知道:

如果两个用户(或更多)同时打开一个页面并且因为:

  • 他们有不同的 PDO 连接和
  • MySQL 可以在不同的线程中同时运行两个或多个请求
  • 因为我将提取查询隔离在事务中,

我是否总能得到预期的独特结果?

我读过@symcbean 关于 Does MySQL queue queries? 的回答他提到:

It's very improbable that 2 queries could arrive at the same time - but not impossible

我的代码结构是否有助于我避免并行查询?

最佳答案

考虑到两个查询同时到达的场景,事务所做的只是为每个线程的数据库操作保证 ACID 行为。这并不意味着两组选择/更新不能同时发生;这实际上可能发生。

处理此问题的一种方法是使用 SELECT ... FOR UPDATE :

SELECT id FROM tableName WHERE t_date + INTERVAL 1 MINUTE < NOW() LIMIT 1 FOR UPDATE;
UPDATE tableNAME SET t_date=NOW() WHERE id = $id;

FOR UPDATE 子句将告诉 MySQL 锁定单个匹配的 id 行,这样即使有另一个线程进来,它也无法锁定,因此无法更新。

编辑:

正如@tadman 指出的那样,您甚至可以在这里只使用一个查询:

UPDATE tableNAME
SET t_date = NOW()
WHERE id = (SELECT id FROM tableName WHERE t_date + INTERVAL 1 MINUTE < NOW() LIMIT 1);

关于php - 我的查询是否锁定该行以供下次使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55521355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com