Php 使用select更新MySQL

Php 使用select更新MySQL,php,mysqli,Php,Mysqli,我有一个包含文章(articles)的表格,这些文章的内容将由团队通过Internet(PHP)访问并根据文章状态和id自动分配要处理的文章来更新。 我们有文章的id(artid)、内容(artcont)和更新状态(artstat):Y(yes)/N(no)/B(blocked) 当团队的一名成员想要更新文章时,我想自动为他选择artstat为“否”且articleid最低的文章,同时将artstat设置为“已阻止”(以防止其他团队成员同时对其进行编辑).我想同时返回正在编辑的artid 目前,

我有一个包含文章(articles)的表格,这些文章的内容将由团队通过Internet(PHP)访问并根据文章状态和id自动分配要处理的文章来更新。 我们有文章的id(artid)、内容(artcont)和更新状态(artstat):Y(yes)/N(no)/B(blocked)

当团队的一名成员想要更新文章时,我想自动为他选择artstat为“否”且articleid最低的文章,同时将artstat设置为“已阻止”(以防止其他团队成员同时对其进行编辑).我想同时返回正在编辑的artid

目前,我在PHP中有一个select查询,后面紧接着一个更新查询:

....(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";
}
…(连接到数据库的凭据)。。。
$conn=mysqli\u connect($servername、$username、$password、$dbname);
$sql=SELECT*从artstat='N'按artid asc限额1订购的文章中选择;
$result=mysqli\u查询($conn,$sql);
if(mysqli_num_rows($result)==1){
//输出数据
$row=mysqli\u fetch\u assoc($result);
echo“id:”.$row[“artid”]。“
”; $upd=“更新文章集artstat='B'其中artid=”.$row[“artid”]; mysqli_查询($conn,$upd); } 否则{ 回显“0结果”; }
现在,我的问题是:是否有可能第二个团队成员(在另一个打开的连接上)想要在select和update语句执行期间提交一篇文章,他会得到相同的文章来处理(artstat还不是“B”),不是吗

如何避免这种情况


多谢各位

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

  • 表级锁定

  • 行级锁定

    为此,您需要行级锁定

您可以从下面的stack over flow post中了解更多信息


$sql=SELECT*从artstat='N'按artid asc限额1订购的文章中选择这是一个直接的解析错误和/或甚至是一个未定义的常量选择通知。是的,你有一个潜在的竞争条件。解决这个问题的方法是事务。我考虑的是存储过程。如果存储过程被另一个团队工作人员第二次调用,他将必须等待第一次调用首先完成?或者服务器会在呼叫时尝试执行它们?谢谢。是的,我已经考虑过了。据我所知,锁定用于更新/删除,因此我无法锁定要读取的记录。我会读你指给我看的那篇文章,也许我会找到解决办法。再次感谢您选择。。。。。FOR UPDATE具有“意图独占”(IX)记录锁。同一记录上的第二个事务,使用select。。。for update语句是兼容的。请参阅链接:。所以我无法在它上获得读取锁定。