Кратко.
1. Обнаружил в проекте несогласованность данных
2. Сделал транзакции с уровнем изолированности REPEATABLE READ
3. Проблема не решилась
Теперь немного подробнее.
Классическая задача из главы по Транзакциям, есть магазин, куда пользователь выставляет свой товар. Контрагент покупает выставленный товар.
Почему-то возникает ситуация, при которой уже купленный товар, либо снятый с продажи, покупает еще один пользователь.
Почему так происходит?
Может ли, на это как то влиять, подготовленные запросы?
Использую расширение pdo
Отмена лота
<?php
// shop.php пример
...
$pdo->begintransaction();
if (isset($remove))
{
$que = "SELECT `id` FROM `shops` WHERE `product_id` = ? AND `status` = ''";
$pre = $pdo->prepare($que);
$pre->execute([$product]);
$res = $pre->fetchColumn();
if ($res)
{
$que = "UPDATE `shops` SET `status` = 'Отозвано' WHERE `id` = $res";
$pdo->exec($que);
}
}
$pdo->commit();
...
?>
Покупка лота
<?php
// buy.php пример
...
$pdo->begintransaction();
if (isset($product))
{
$que = "SELECT `id` FROM `shops` WHERE `product_id` = ? AND `status` = ''";
$pre = $pdo->prepare($que);
$pre->execute([$product]);
$res = $pre->fetchColumn();
if ($res)
{
$que = "UPDATE `shops` SET `status` = 'Продано' WHERE `id` = $res";
$pdo->exec($que);
}
}
$pdo->commit();
...
?>
Может пригодитсяСервер: Localhost via UNIX socket
Версия сервера: 8.0.23-0ubuntu0.20.04.1 - (Ubuntu)
Кодировка сервера: UTF-8 Unicode (utf8mb4)
nginx/1.18.0
Версия клиента базы данных: libmysql - mysqlnd 7.4.3
Версия PHP: 7.4.3