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

Статус
В этой теме нельзя размещать новые ответы.

Горбушка

Ищу её...
Регистрация
2 Май 2008
Сообщения
3.444
Реакции
2.523
Всем привет.

Есть сервер 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 запрос?
После выполнения первого, эти строки не попадают в условие для второго, но запросы выполняются одновременно.
Вариант, что второму запросу не хватило строк устраивает.
 

svfolder

Постоялец
Регистрация
31 Июл 2013
Сообщения
159
Реакции
156
  • Заблокирован
  • #2
Запросы не могут выполняться одновременно!
В смысле на чтение могут, а на запись нет!
В момент первого запроса произойдет блокировка либо на уровне таблицы, либо на уровне ячеек, как двиг базы решит.
И только после того как первый запрос выполнится и сбросится буфер, отработает второй запрос.
 

Горбушка

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

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

svfolder

Постоялец
Регистрация
31 Июл 2013
Сообщения
159
Реакции
156
  • Заблокирован
  • #4
Да верно, второй запрос попытается выполниться после того как все данные уже будут изменены. И второй запрос по сути ничего не сделает, по логике. Если какой то еще запрос не вклинится и не изменит данные до выполнения второго в вашем случае запроса.
 

Горбушка

Ищу её...
Регистрация
2 Май 2008
Сообщения
3.444
Реакции
2.523
В общем, подтвердилось.

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

@svfolder, огромное спасибо!
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху