Обучение/Помощь новичкам | Блокировка БД
А что бы выбрал(а) ты? (Открытое голосование)
lastInsertId() (1 чел. - 100 %)
LOCK TABLES (0 чел. - 0 %)
Всего проголосовало: 1 чел.
Допустим у меня такой пример Возможен ли вариант что во время "sleep" какой-нибудь другой юзер добавит еще одну свою запись и я в $last получу левый id ? Если да, то как этого избежать? Как заблокировать таблицу от изменений во время работы скрипта?
php
<?php db::exec("INSERT INTO log(ip, action) VALUES ('xxx', 'yyy')"; sleep(rand(10, 60)); # Некая ресурсоёмкая задача # А тут мне надо получить id этой записи $last = db::fetch("SELECT id FROM log ORDER BY id DESC LIMIT 1");
Те же яйца только в профиль. Я про блокировку спросил
Те же яйца только в профиль. Я про блокировку спросил
Потом UNLOCK после выполнения
Допустим у меня такой пример
php
<?php db::exec("INSERT INTO log(ip, action) VALUES ('xxx', 'yyy')"; sleep(rand(10, 60)); # Некая ресурсоёмкая задача # А тут мне надо получить id этой записи $last = db::fetch("SELECT id FROM log ORDER BY id DESC LIMIT 1"); php
<?php db::beginTransaction(); db::exec("INSERT INTO log(ip, action) VALUES ('xxx', 'yyy')"; sleep(rand(10, 60)); $last = db::fetch("SELECT id FROM log ORDER BY id DESC LIMIT 1"); db::commit(); ________
посл. ред. 16.08.2023 в 11:19; всего 1 раз(а); by mrcatoff
Вот это походу то что надо. А если где-то между локом и анлоком скрипт сдохнет (например из-за fatal error), то база останется заблокированной?
Адм
(16 авг 2023, в 11:19)https://www.php.net/manual/en/pdo.begintransaction.php
php
<?php db::beginTransaction(); db::exec("INSERT INTO log(ip, action) VALUES ('xxx', 'yyy')"; sleep(rand(10, 60)); $last = db::fetch("SELECT id FROM log ORDER BY id DESC LIMIT 1"); db::commit(); ________
посл. ред. 16.08.2023 в 11:36; всего 2 раз(а); by Something
Вот это походу то что надо. А если где-то между локом и анлоком скрипт сдохнет (например из-за fatal error), то база останется заблокированной?
Ты повесил замок, пока не откроешь не попадешь
Те же яйца только в профиль. Я про блокировку спросил
https://ru.stackoverflow.com/questions/453648/Какой-id-...tid-из-pdo
Ты не только про блокировку спрашивал
Я ответила оптимальный вариант для получения ид
Зачем блокировать всю таблицу?
________
посл. ред. 16.08.2023 в 14:46; всего 1 раз(а); by Лара
Допустим у меня такой пример
php
<?php db::exec("INSERT INTO log(ip, action) VALUES ('xxx', 'yyy')"; sleep(rand(10, 60)); # Некая ресурсоёмкая задача # А тут мне надо получить id этой записи $last = db::fetch("SELECT id FROM log ORDER BY id DESC LIMIT 1"); php
<?php $db = new PDO("your_database_connection_details"); try { $db->beginTransaction(); $insertQuery = "INSERT INTO log(ip, action) VALUES ('xxx', 'yyy')"; $db->exec($insertQuery); sleep(rand(10, 60)); // Некая ресурсоёмкая задача $selectQuery = "SELECT id FROM log ORDER BY id DESC LIMIT 1"; $last = $db->query($selectQuery)->fetchColumn(); $db->commit(); } catch (Exception $e) { $db->rollBack(); // Обработка ошибки } ?> Стр.: 1, 2