我有一个包含文章(文章)的表格,其内容由一个通过互联网(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'),不是吗?
如何避免这种情况?
谢谢。
答案 0 :(得分:0)
在Mysql中,有两种类型的锁定可以避免 innodb 引擎中的这种情况
表级锁定
行级锁定
您需要对此
您可以从以下堆栈中了解更多相关信息。
https://dba.stackexchange.com/questions/15854/innodb-row-locking-how-to-implement