Я хотел бы знать, есть ли сценарий реального случая, в котором проблемы с условиями гонки могут действительно возникать при запросе на вставку. Поэтому у меня есть таблица «User» со следующими полями:MySQL Вставка: Состояние гонки
User:
iduser | idcompany | name | email
я использую составной первичный ключ для этой таблицы, который (iduser, idcompany). Никому из этих полей не присвоено значение AUTO_INCREMENT. Я получаю значение поля «idcompany» через переменную сеанса, поэтому в этом нет реальной проблемы. Тем не менее, я использую функцию getNextUserId(), чтобы получить следующее действительное значение iduser через выберите запрос, как это:
SELECT MAX(iduser) + 1 AS next_iduser FROM User WHERE idcompany = {myCompanyId};
Интересно, есть ли случай, в котором дублирует сочетание (iduser, idcompany) может быть вставлен в базу данных из-за состояния гонки, и если да, то как этот сценарий возможен. Не блокирует ли MySQL таблицу при вставке? Не будет ли исключена дублируемая комбинация (iduser, idcompany), или у меня действительно может быть дублирующий первичный ключ в моей таблице? Я знаю стратегии, которые полностью предотвращают состояние гонки, например, используя первичный ключ AUTO_INCREMENT, используя транзакции SQL или вручную блокируя таблицу «Пользователь», но я хотел бы понять механизм возможного состояния гонки в этом случае и каковы реальные проблемы в это осуществление. Прямо сейчас ни одно из этих полей не должно быть уникальным в моей таблице по очевидным причинам, но я хотел бы знать, может ли ограничение UNIQUE для iduser изменить сценарий, с которым я столкнулся, и почему это происходит.
Он блокируется во время вставки, но не в то время как 10 пользователей из одной компании все пытаются зарегистрироваться, и вам нужно запустить SELECT, чтобы найти следующий идентификатор, который будет использоваться 10 раз без блокировки. Вы действительно должны делать это в транзакции, но предполагается, что вы используете PDO или MYSQLI, а таблицы базы данных - INNODB. – RiggsFolly
. Вы можете взглянуть на 'SELECT ..... WITH LOCK' [здесь, в руководстве] (http://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html) – RiggsFolly
Как я прямо говорю в своем вопросе, я не ищу решение моей проблемы, я пытаюсь понять возможные последствия в моей реализации. Билл Карвин ссылается в своей книге «SQL Antipatterns», что эта практика приведет к условиям гонки, поэтому я пытаюсь выяснить, какие из возможных сценариев в этом случае. – iiirxs