这是我在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
}
如您所见,我的功能:
代码可以正常工作,我也没有任何与代码结构有关的问题。
问题
您可以看到,每个请求的ID始终应该是唯一的。我正在使用MySQL,想知道:
如果两个(或多个)用户同时打开页面,原因是:
我总是会得到预期的独特结果吗?
我已经阅读了关于Does MySQL queue queries?的@symcbean答案,他提到:
两个查询可以同时到达非常不可能- 但并非不可能
我的代码结构是否可以帮助我避免并行查询?
答案 0 :(得分:2)
考虑到两个查询同时到达的情况,所有事务都保证了每个线程的数据库操作的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;
子句将告诉MySQL锁定单个匹配的FOR UPDATE
行,这样,即使有另一个线程进入,它也将无法锁定,因此无法更新。 / p>
编辑:
@tadman指出,您甚至可以在这里使用单个查询:
id