gpt4 book ai didi

mysql - 使用 mysql_affected_rows 来防止竞争条件

转载 作者:行者123 更新时间:2023-11-29 01:04:24 26 4
gpt4 key购买 nike

使用以下代码来防止竞争条件是否安全? (keystatus字段和mysql_affected_rows用来实现加锁)

$mres = mysql_query("SELECT `values`, `key`, `status` 
FROM `test`
WHERE `id` = 1");
$row = mysql_fetch_array($mres);
if($row['status'] != UPDATING) {
$mres = mysql_query("UPDATE `test` SET
`status` = UPDATING,
`key` = `key` + 1
WHERE `id` = 1 AND `key` = ".$row['key']);
if($mres && mysql_affected_rows()) {
//update here safely and then...
mysql_query("UPDATE `test` SET
`status` = NOT_UPDATING,
`key` = `key` + 1
WHERE `id` = 1");
}
}

我的测试表明,要么它不安全,要么我应该在我的代码中搜索一个隐藏得很好的错误。表是 MyISAM

最佳答案

在检索值之前,您应该先“获取锁”。否则它们可能会在您获得锁定之前更改。

$mres = mysql_query("UPDATE `test` SET
`status` = 'UPDATING'
WHERE `id` = 1 AND `status` = 'NOT_UPDATING'");
if ($mres && mysql_affected_rows()) {
// got the lock
// now select and update
}
  • id 最好是数据库中的唯一字段,否则事情可能会很奇怪
  • 我看不出增加 key 的理由
  • 注意我在 sql 中引用了字符串 'UPDATING''NOT_UPDATING'
  • 在您的代码中,在与 php 常量 比较之前,您还应该检查 $row['status'] 是否具有有意义的值(如果它为 false/null 怎么办?)更新中
  • 希望您对 php 有足够的了解,知道 php 字符串应该被引用。

关于mysql - 使用 mysql_affected_rows 来防止竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11163359/

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