Является ли в MySQL операция инкрементирования в UPDATE транзакционно-безопасной? Возможно ли состояние гонки, когда несколько клиентов одновременно выполняют запрос вроде «UPDATE mytable SET myfield=myfield+1 WHERE id=myid»? Если тысяча клиентов одновременно выполнят такой запрос на строке с базовым значением 0, то будет ли в конце значение равно тысяче?
Да, будет равно имеено 1000 в конце. независимо от движка. В разных движках это обеспечивается по разному. Нампример в innodb блокиоровкой конкретной записи. В Myisam — блокировкой всей таблицы на короткое время.
Посмотрите принцип действия update.
Запись блокируется, выполняется update и потом дальше можно только работать с этой записью. В принципе из-за этого, в некоторых статьях по оптимизации и уменьшению нагрузки на сервер, рекомендуют не использовать часто update
Далеко не факт, что значение будет 1000, особенно учитывая тот факт, что в InnoDB применяется MVCC Учитывая это при одновременном выполнении 1000 запросов, каждый из них будет увеличивать значение с нуля до единицы.
Для каждой транзакции создается своя «копия» таблицы. Если у нас запускается одна транзакция, которая увеличивает значение с нуля до единицы и параллельно с ней сделать селект он вернет 0.
Зачем писать то, чего не знаете? Если ваша транзакция пишет в запись какие-то данные, никакая другая транзакция в innodb не сможет туда писать. Запись заблокирована. Читать оттуда можно (в зависимости от isolation level) а писать — ничего не выйдет, новая транзакция будет ждать освобождения записи. Если запись долгое время не будет освобождена, новая транзакция просто будет прервана с ошибкой ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction