是否可以部分运行SQL更新查询?

时间:2017-02-11 01:43:26

标签: php mysql sql-update partial

我正在维护一个我几个月前开发的网站,现在有一个查询有时会部分(或者某种程度上)运行。

它会更新帐户级别并从帐户余额中扣除其费用。运行查询的代码是下一个:

$last = ( microtime(true) - 600) * 10000; // 10 minutes ago
$sql = "UPDATE users SET level = " . $new_level . ", last_claim = '$last', level_days_left = 30, balance = balance - $price WHERE id = $user_id LIMIT 1";
$result = $conn->query($sql);

它通常运作良好,但有时它不会:D 当它没有时,余额保持不变,其余的字段都改变了。

我第一次注意到这一点我认为问题是$ price中包含的金额可能为0.当计算价格从数据库中提取时,我添加了一些检查,如果价格提取不成功则停止执行或者如果提取的数量是0。

之后的几天又失败了所以我添加了一个函数来运行时调试所有这些查询。这是最后一次失败的查询:

UPDATE users SET level = 2, last_claim = '14866845029652', level_days_left = 30, balance = balance - 1000000 WHERE id = 9706 LIMIT 1

除了余额之外,所有字段都已更改。这可能发生吗?它不会返回任何错误吗?如果出现错误,为什么不还原更改?最后......处理这种情况的最佳方法是什么?我是否在此之后立即运行另一个查询以检查更改是成功还是效率低?

一些额外信息:

  • 数据库是MySQL
  • 该网站是用PHP编写的
  • 余额是无符号的bigint
  • 是的,代码检查余额是否足以支付该价格
  • 余额不足以超出bigint最大值

是的,不多了:D

0 个答案:

没有答案