Я пытаюсь создать функцию fb-like-button (а не facebook api). На моем сайте есть две кнопки: нравится и не нравится. База данных сохранит, сколько всего нравится и не нравится в целом.SELECT ... FOR UPDATE с подготовленным оператором не работает
Вот дб таблица:
id |post_id |like_count
40 | 20 | 0
код, когда пользователь нажимает кнопку, как:
$id = 40;
$conn->autocommit(FALSE);
$conn->query("BEGIN;");
//lock the row to prevent race condition
$sql = "SELECT like_count FROM post_like WHERE id = ? LIMIT 1 FOR UPDATE";
$stmt = $conn->prepare($sql);
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->close();
//update the table
$sql = "UPDATE post_like SET like_count = like_count + 1 WHERE id = ? LIMIT 1";
$stmt = $conn->prepare($sql);
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->close();
$conn->commit();
$conn->autocommit(TRUE);
$conn->close();
//when success, display unlike button to user throught AJAX
и код, когда пользователь нажимает кнопку в отличие:
$id = 40;
$conn->autocommit(FALSE);
$conn->query("BEGIN;");
//lock the row to prevent race condition
$sql = "SELECT like_count FROM post_like WHERE id = ? LIMIT 1 FOR UPDATE";
$stmt = $conn->prepare($sql);
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->close();
//update the table
$sql = "UPDATE post_like SET like_count = like_count - 1 WHERE id = ? LIMIT 1";
$stmt = $conn->prepare($sql);
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->close();
$conn->commit();
$conn->autocommit(TRUE);
$conn->close();
//when success, display like button to user throught AJAX
здесь проблема ...
количество похожих_счет начинается с 0.
Теоретически, если есть только один человек, нажмите кнопку, например, номер_сочетания не будет превышать 0.
(нажмите кнопку -> -> lock row-> like_count + 1-> release row-> отобразить непохожие кнопки)
(щелкните в отличие от кнопки-> lock row-> like_count-1-> release row-> display like button)
Я получаю эту работу сразу, когда я нажимаю кнопку медленно, однако, когда я быстро нажимаю кнопку , число like_count может превышать 2, и иногда это может быть отрицательное число.
Я понятия не имею, что я сделал неправильно. Пожалуйста помоги!
за последнее обновление, зачем выполнять до bind_param? –
Позвольте мне задать вам вопрос. Что здесь не так с состоянием гонки? –