Я поддерживаю веб-сайт, который я разработал пару месяцев назад, и есть запрос, который иногда выполняется частично (или что-то в этом роде).
Он обновляет уровень аккаунта и вычитает его стоимость из баланса аккаунта. Код, который запускает запрос, следующий:
$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
Все поля были изменены, кроме баланса. Может ли это случиться? Разве это не возвращает ошибку? В случае ошибки, почему бы не отменить изменения? И наконец … как лучше всего справиться с этой ситуацией? Я запускаю другой запрос сразу после этого, чтобы проверить, были ли изменения успешными или это неэффективно?
Некоторая дополнительная информация:
И да, не намного больше: D
Задача ещё не решена.
Других решений пока нет …