#php #mysql #transactions
#php #mysql #транзакции
Вопрос:
Мне интересно, заблокирует ли транзакция MySQL, инициированная из PHP, таблицу, чтобы я мог генерировать свои собственные случайные значения, которые можно записать в столбец с уникальным ограничением, не опасаясь столкновения?
Допустим, я хочу записать новую строку в таблицу, где для столбца существует уникальное ограничение uuid
. Поэтому я мог бы сделать что-то вроде этого:
$mysqlDB->beginTransaction();
$isUnique = false;
$randomstring = randomstring();
while(!$isUnique) {
$cnt = query("SELECT COUNT(*) FROM table WHERE uuid = $randomstring");
if($cnt < 1)
$isUnique = true;
$randomstring = randomstring();
}
query("INSERT INTO TABLE fields..., uuid = $randomstring";
$mysqlDB->completeTransaction();
Может ли транзакция MySQL, запущенная из основной библиотеки абстракции базы данных PHP, выполнить это без каких-либо шансов на столкновение?
Да, и если предположить, что это InnoDB
Комментарии:
1. Предполагая innodb? Все еще пытаюсь ответить на реальный вопрос здесь. Вы рассматривали возможность использования уникального индекса?
2. правильно, используя InnoDB, я обновил вопрос с этой информацией
3. Это плохая идея даже пытаться. Таблица потенциально может быть заблокирована на долгое время, если ваша случайная строка неверна. Что вам нужно сделать, это добавить уникальное ограничение для uuid и просто вставлять запись, пока она не завершится успешно. Если ваша randomstring этого не делает, у вас будет в среднем одна попытка.
4. @ficuscr @hanyolo о, я обновил свой вопрос, чтобы конкретно указать, что столбец
uuid
имеет уникальное ограничение на него. Поможет ли транзакция db в любом случае?5. Да, я не экспортирую это, хотя … dev.mysql.com/doc/refman/8.0/en/innodb-locks-set.html Думаю, это может быть сценарий, в котором вы получаете эти пробелы в автоматических приращениях после отката. Можно в значительной степени гарантировать, что это будет наиболее эффективный подход, хотя и более атомарный, чем то, что вы можете сделать с транзакцией — или, по крайней мере, похоже на это. Под капотом может быть больше похоже, чем я понимаю.