Рассмотрим такую ситуацию:Выполняет ли транзакция все проблемы с условиями гонки в MySQL?
- Begin сделка
- Вставка 20 записей в таблицу с auto_increment ключом
- Получить первую вставку идентификатора (скажем, это
153
) - Обновление всех записей в этой таблице где
id >= 153
- Commit
Безопасен ли шаг 4?
То есть, если другой запрос поступает почти точно в одно и то же время и вставляет еще 20 записей после шага 2 выше, но до шага 4 будет состояние гонки?
Почему у вас есть отдельный шаг обновления, а не просто вставка правильных данных в первую очередь? Это довольно странно. Вам не нужно будет беспокоиться о «состоянии гонки», если вы ввели правильные данные в первую очередь. Обновление 'WHERE id> 153' также очень странный запрос. Идентификаторы автоматического увеличения не имеют для них никакой логики, и поэтому вы никогда не должны (насколько мне известно) обновляться исключительно на основе id. И, наконец, я не знаю никакой функции «first insert id». –
@ButtleButkus http://dev.mysql.com/doc/refman/5.0/information-functions.html#function_last-insert-id "Если вы вставляете несколько строк, используя один оператор INSERT, LAST_INSERT_ID() возвращает значение сгенерированный для первой вставленной строки " – nickf
Вы правы относительно LAST_INSERT_ID(), но это не меняет того факта, что вопрос, похоже, связан с гипотетической ситуацией, которая никогда не будет существовать, если следовать основной структуре базы данных и процедуре. Почему ваш критерий обновления когда-либо был бы значением бессмысленного идентификатора? Я не могу думать ни о какой причине. Я бы не назвал это «расовым состоянием», потому что это бессмысленно. Зачем вам сразу обновляться после вставки, когда вы можете просто вставить правильные значения для начала?Это реальные причины, по которым этот вопрос не имеет смысла. –