选择MySQL更新

时间:2016-01-26 17:51:23

标签: php mysqli

我有一个包含文章(文章)的表格,其内容由一个通过互联网(PHP)访问它们的团队进行更新,并根据文章状态和ID自动分配要处理的文章。 我们有文章的id(artid),其内容(artcont)及其更新状态(artstat):Y(是)/ N(否)/ B(被阻止)。

当团队的一名成员想要更新文章时,我想自动为他选择有artstat“no”和最低articleid的文章,同时将artstat设置为“阻止”(以防止它由其他团队成员同时编辑)。我希望同时返回正在编辑的artid。

目前,我在PHP中有一个选择查询,紧接着是更新一个:

....(credentials for connecting to database)... 
$conn = mysqli_connect($servername, $username, $password, $dbname);
$sql=SELECT * from articles where artstat='N' order by artid asc LIMIT 1;
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) == 1) {
// output data
$row = mysqli_fetch_assoc($result);
echo "id: " . $row["artid"]. "<br>";
$upd = "UPDATE articles SET artstat='B' where artid=" .$row["artid"];
mysqli_query($conn, $upd);
}
else {
echo "0 results";
}

现在,我的问题是:是否有可能第二个团队成员(在另一个打开的连接上)想要处理一篇文章,他的请求恰好在执行select和update语句之间,他会得到同样的文章合作(artstat还不是'B'),不是吗?

如何避免这种情况?

谢谢。

1 个答案:

答案 0 :(得分:0)

在Mysql中,有两种类型的锁定可以避免 innodb 引擎中的这种情况

  • 表级锁定

  • 行级锁定

    您需要对此

  • 进行行级锁定

您可以从以下堆栈中了解更多相关信息。

https://dba.stackexchange.com/questions/15854/innodb-row-locking-how-to-implement