@phpcoder81

Нужно ли блокировать таблицу?

Парни, дайте совет.
Очень много такого рода кода на сайте. Нужно вставить данные в одну таблицу, потом получив уникальный номер, вставить его во вторую. При этом нужно учесть то, что с сайтом одновременно работают много людей. Не не хотелось бы внезапного "сбоя" или ошибок.

$stmt = DB::prepare('INSERT INTO `vendor` (`name`) VALUE (?)');
$stmt->execute(array('BMW'));

$id = DB::lastInsertId();

$stmt = DB::prepare('INSERT INTO `model` (`vendor_id`, `name`) VALUE (?, ?)');
$stmt->execute(array($id, 'X5'));


1. Нужно ли блокировать таблицу или делать транзакцию?
2. Если нужно блокировать, то только две таблицы?
  • Вопрос задан
  • 97 просмотров
Решения вопроса 2
2ord
@2ord
Выполнить запросы в одной транзакции (begin ... commit).
Ответ написан
Комментировать
@EvgeniiR
https://github.com/EvgeniiR
Парни, дайте совет.

Совет - Юзай UUID. Идеальное решение для таких случаев
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@BorisKorobkov Куратор тега MySQL
Web developer
lastInsertId() работает в рамках одного коннекта, то есть одновременно большое количество людей (запросов в разных коннектах) - не проблема.

На случай сбоя второго запроса и неконсистентных данных - надо использовать транзакцию, чтобы в этом случае первый запрос откатывался автоматически. Если же 'BMW' без 'X5' не проблема, то транзакцию использовать не обязательно.

Блокировать таблицы не надо, это лишь приведет к сильным тормозам.

P.S. Перед вставкой не забудьте проверить уже наличие такой записи. Или хотя бы создайте уникальный индекс по текстовому полю и добавьте '... ON DUPLICATE KEY ...'
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы