@Victorius13

Как избежать параллельных запросов MySql?

Есть скрипт, который должен записывать + и -, которые ставит пользователь на разных страницах. Но при параллельных запросах от одного пользователя иногда происходит так, что пользователь ставит вместо 1 + (или -) два и больше. Пытался это исправить с помощью транзакций, но не помогло. Как возможно решить данную проблему? Буду очень благодарен!
include '../lib/connect.php';
    include '../lib/login.php';

	$pade = mysqli_real_escape_string($link, htmlspecialchars($_POST['pade'], ENT_QUOTES));
	$var = mysqli_real_escape_string($link, htmlspecialchars($_POST['var'], ENT_QUOTES));
	$user = login();
	mysqli_begin_transaction($link, MYSQLI_TRANS_START_WITH_CONSISTENT_SNAPSHOT);
	if ($user != false){
		$result = mysqli_query($link, "SELECT * FROM users_rate WHERE id_pade='$pade' AND id_user='$user'");
		if (mysqli_num_rows($result) == 0) {
			mysqli_query($link, "INSERT INTO users_rate(id_pade, id_user, var) VALUES ('$pade','$user','$var')");
			if ($var){
				mysqli_query($link, "UPDATE users_stats SET rate=rate+1 WHERE name='$pade'");
				echo '{"success":true,"rez":1,"msg":"Плюс успешно поставлен"}';
			} else {
				mysqli_query($link, "UPDATE users_stats SET rate=rate-1 WHERE name='$pade'");
				echo '{"success":true,"rez":-1,"msg":"Минус успешно поставлен"}';
			}
		} else {
			$data = mysqli_fetch_array($result);
			if ($data['var'] == $var){
				if ($var){
					echo '{"success":false,"rez":0,"msg":"Вы уже ставили плюс"}';
				} else {
					echo '{"success":false,"rez":0,"msg":"Вы уже ставили минус"}';
				}
			} else {
				mysqli_query($link, "DELETE FROM users_rate WHERE id_pade='$pade' AND id_user='$user'");
				if ($var){
					mysqli_query($link, "UPDATE users_stats SET rate=rate+1 WHERE name='$pade'");
					echo '{"success":true,"rez":1,"msg":"Вы убрали свой минус"}';
				} else {
					mysqli_query($link, "UPDATE users_stats SET rate=rate-1 WHERE name='$pade'");
					echo '{"success":true,"rez":-1,"msg":"Вы убрали свой плюс"}';
				}
			}
		}
	}
	mysqli_close($link);
  • Вопрос задан
  • 432 просмотра
Решения вопроса 1
inoise
@inoise Куратор тега PHP
Solution Architect, AWS Certified, Serverless
Php и MySQL не решают эти вопросы сами по себе. Решения могут быть очень разные, например, тут достаточно, вероятно, поставить уникальный составной ключ на таблицу и тогда новые записи не появятся по тому как транзакции выполняются последовательно
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега PHP
По-моему, это не вопрос, а очередная влажная фантазия.
Один и тот же юзер не в состоянии создавать "параллельные запросы".
Тут скорее логика хромает. Зачем-то сделано удаление записи, дальше идёт какое-то анонимное голосование(?!). почему-то можно ставить плюсы несколько раз.

Удалите этот вопрос и вместо этого спросите, как сделать голосование нормально. В общем случае все делается 1 запросом.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы