Как будут выполнены запросы?

Тема в разделе "Базы данных", создана пользователем Горбушка, 24 апр 2020.

XEvil 4.0 Релиз Состоялся!
Статус темы:
Закрыта.
Модераторы: latteo
  1. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.401
    Симпатии:
    2.365
    Всем привет.

    Есть сервер MySQL/MariaDB. Выполняется 2 SQL запроса одновременно (идеализируем условия) :
    Код:
    UPDATE table SET pole = 1 WHERE pole = 0 LIMIT 100;
    UPDATE table SET pole = 2 WHERE pole = 0 LIMIT 100;
    Запросы выполняются разными клиентами.

    Можем ли мы быть уверены, что второй запрос не затронет строки, которые затронул 1 запрос?
    После выполнения первого, эти строки не попадают в условие для второго, но запросы выполняются одновременно.
    Вариант, что второму запросу не хватило строк устраивает.
     
  2. svfolder

    svfolder

    Регистр.:
    31 июл 2013
    Сообщения:
    159
    Симпатии:
    155
    Запросы не могут выполняться одновременно!
    В смысле на чтение могут, а на запись нет!
    В момент первого запроса произойдет блокировка либо на уровне таблицы, либо на уровне ячеек, как двиг базы решит.
    И только после того как первый запрос выполнится и сбросится буфер, отработает второй запрос.
     
    Nei, Горбушка и Sorcus нравится это.
  3. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.401
    Симпатии:
    2.365
    Что произойдёт блокировка я знаю и что второй запрос встанет в очередь понимаю.
    Меня интересовало какие данные получит второй запрос для изменения - на момент постановки в очередь или на момент выполнения?

    Т.е. я правильно понимаю, что второй запрос получит выборку строк для изменения уже после применения первого изменения?
    И строки, изменённые первым запросов не могут быть изменены вторым запросом в нашем конкретном случае, т.к. более не попадают под условие WHERE?
     
  4. svfolder

    svfolder

    Регистр.:
    31 июл 2013
    Сообщения:
    159
    Симпатии:
    155
    Да верно, второй запрос попытается выполниться после того как все данные уже будут изменены. И второй запрос по сути ничего не сделает, по логике. Если какой то еще запрос не вклинится и не изменит данные до выполнения второго в вашем случае запроса.
     
    Горбушка нравится это.
  5. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.401
    Симпатии:
    2.365
    В общем, подтвердилось.

    Т.к. я не люблю теорию, а люблю практику - взял MySQL, залил в неё 1 миллион записей и запустил 2 процесса PHP в параллель с этими запросами.
    Каждый процесс выполнял по 5 000 запусков, забирая каждый раз по 100 строк "на себя".
    В результате ровно по 500 000 строк на каждом (т.к. забрав 500к первый остановился).

    @svfolder, огромное спасибо!
     
Статус темы:
Закрыта.