#mysql
#mysql
Вопрос:
Я пишу запросы MySQL в многопоточной среде, чтобы этот запрос мог быть выполнен в любом заданном количестве потоков. Моей базой данных является MySQL 8, использующий движок InnoDB.
Пусть говорит, что у меня есть таблица БД с 10 числами (1,2,3,4,5,6,7,8,9,10)
У меня есть ВЫБОР… ДЛЯ запроса НА ОБНОВЛЕНИЕ с ограничением в 2 строки из таблицы в базе данных. ДЛЯ ОБНОВЛЕНИЯ будут заблокированы строки для обеспечения изоляции. Если у меня есть 5 потоков, которые запускаются одновременно, поток 1 захватит записи 1 и 2, поток 2 увидит, что поток 1 получил записи 1 и 2, поэтому он перейдет к захвату 3 и 4 .. и так далее.
Будет ли это вести себя таким образом?
Ответ №1:
Нет, блокировки не должны влиять на план запроса. Запросы будут пытаться выбрать те строки, которые соответствуют критериям WHERE
и ORDER BY
. Если они заблокированы другим потоком, он заблокируется.
Кроме того, блокировка будет зависеть от того, используют ли предложения WHERE
или ORDER BY
индексированные столбцы или нет. Если вы исследуете неиндексированные столбцы, ему придется сканировать всю таблицу, чтобы найти или упорядочить строки, что эффективно заблокирует всю таблицу. Если вы ограничите эти предложения индексированными столбцами, он должен просто иметь возможность устанавливать блокировки для этих индексов.
См. Использование LIMIT ДЛЯ ОБНОВЛЕНИЯ в инструкции SELECT на форуме MySQL для получения дополнительной информации.
Комментарии:
1. ах, хорошо, это приведет к блокировке, и будут изменены только 1 поток, выбранный ДЛЯ ОБНОВЛЕНИЯ данных (в моем случае сохраненный где-то еще, а затем удаленный). Во время блокировки любых заданных потоков для набора строк эти строки все еще могут быть прочитаны?
2. Когда строка заблокирована потоком, этот же поток может читать и записывать их. Блокировки блокируют только другие потоки.