Возможно ли частичное выполнение запроса на обновление SQL?

Я поддерживаю веб-сайт, который я разработал пару месяцев назад, и есть запрос, который иногда выполняется частично (или что-то в этом роде).

Он обновляет уровень аккаунта и вычитает его стоимость из баланса аккаунта. Код, который запускает запрос, следующий:

$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
Когда это не так, баланс остается равным, а остальные поля меняются нормально.

В первый раз, когда я заметил это, я подумал, что проблема заключалась в том, что сумма, содержащаяся в цене $, может быть равна 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

И да, не намного больше: D

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]