Транзакции, инкрементирование и MySQL UPDATE

Является ли в MySQL операция инкрементирования в UPDATE транзакционно-безопасной? Возможно ли состояние гонки, когда несколько клиентов одновременно выполняют запрос вроде «UPDATE mytable SET myfield=myfield+1 WHERE id=myid»? Если тысяча клиентов одновременно выполнят такой запрос на строке с базовым значением 0, то будет ли в конце значение равно тысяче?

Речь о InnoDB.
  • Вопрос задан
  • 3035 просмотров
Пригласить эксперта
Ответы на вопрос 6
@Nc_Soft
В InnoDB блокируется строка, не должно быть ахтунга.
Ответ написан
Комментировать
OdobenusRosmarus
@OdobenusRosmarus
Да, будет равно имеено 1000 в конце. независимо от движка. В разных движках это обеспечивается по разному. Нампример в innodb блокиоровкой конкретной записи. В Myisam — блокировкой всей таблицы на короткое время.
Ответ написан
Комментировать
pentarh
@pentarh
Не вижу ни одной причины сказать «не будет». Иначе просто теряется смысл реляционной СУБД.
Ответ написан
odiszapc
@odiszapc
Запись приведенная вами, абсолютно транзакционно безопасна. Строка блокируется, изменяется, разблокируется.
Ответ написан
Комментировать
usja
@usja
Посмотрите принцип действия update.
Запись блокируется, выполняется update и потом дальше можно только работать с этой записью. В принципе из-за этого, в некоторых статьях по оптимизации и уменьшению нагрузки на сервер, рекомендуют не использовать часто update
Ответ написан
@fr0g
Далеко не факт, что значение будет 1000, особенно учитывая тот факт, что в InnoDB применяется MVCC Учитывая это при одновременном выполнении 1000 запросов, каждый из них будет увеличивать значение с нуля до единицы.
Ответ написан
Ваш ответ на вопрос

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

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