Сведения о вопросе

Kimsanov

14:45, 7th August, 2020

Теги

MySQL    

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

Просмотров: 288   Ответов: 6

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

Речь о InnoDB.



  Сведения об ответе

FAriza

06:23, 11th August, 2020

В InnoDB блокируется строка, не должно быть ахтунга.


  Сведения об ответе

VCe znayu

01:28, 3rd August, 2020

Да, будет равно имеено 1000 в конце. независимо от движка. В разных движках это обеспечивается по разному. Нампример в innodb блокиоровкой конкретной записи. В Myisam — блокировкой всей таблицы на короткое время.


  Сведения об ответе

pumpa

18:11, 24th August, 2020

Не вижу ни одной причины сказать «не будет». Иначе просто теряется смысл реляционной СУБД.


  Сведения об ответе

DAAA

19:43, 19th August, 2020

Запись приведенная вами, абсолютно транзакционно безопасна. Строка блокируется, изменяется, разблокируется.


  Сведения об ответе

prince

19:54, 11th August, 2020

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


  Сведения об ответе

repe

00:53, 3rd August, 2020

Далеко не факт, что значение будет 1000, особенно учитывая тот факт, что в InnoDB применяется MVCC Учитывая это при одновременном выполнении 1000 запросов, каждый из них будет увеличивать значение с нуля до единицы.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться