SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 18.09.2018 18:05:23

webJunior
Завсегдатай
Зарегистрирован: 30.03.2017
Сообщений: 30

Вопрос про FOR UPDATE

Здравствуйте, объясните мне пожалуйста как работает блокировка SELECT ... FOR UPDATE? Читал документацию, но остаются вопросы, ответы которых не могу найти.

Допустим в разных частях приложения есть такой запрос

SELECT * FROM table WHERE status = 1 FOR UPDATE;


В другой части меняется значение status


START TRANSACTION

UPDATE table SET status = 1 WHERE id = somevalue;

COMMIT
..............
ROLLBACK
 


1. Блокируется таблица на любой запрос вида SELECT * FROM table WHERE status = somevalue; или только SELECT * FROM table WHERE status = somevalue FOR UPDATE; ?
2. Блокировка снимается в не зависимости произошел commit или rollback? Т.е на момент запроса если начата транзакция на редактирование, делается блокировка таблицы и снимается как только транзакция завершена?
3. Блокировка скажем так привязана именно к колонке которая используется в WHERE? Что если в WHERE используются несколько колонок?
4. Можно ли такую блокировку применить к insert?

Спасибо!

Отредактированно webJunior (18.09.2018 18:12:42)

Неактивен

 

#2 18.09.2018 18:30:48

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 411

Re: Вопрос про FOR UPDATE

1. Блокируется не таблица, а только выбранные записи в таблице по FOR UPDATE.
2. Думаю да, иначе нет смысла в блокировке.
3. Колонки не имеют значения, без Where будут заблокированы все записи в таблице, но не сама таблица.
4. Это не имеет смысла так как блокируются только выбранные записи. К ним Инсерт не применишь.

Отредактированно klow (18.09.2018 18:33:54)

Неактивен

 

#3 18.09.2018 19:08:21

webJunior
Завсегдатай
Зарегистрирован: 30.03.2017
Сообщений: 30

Re: Вопрос про FOR UPDATE

klow написал:

1. Блокируется не таблица, а только выбранные записи в таблице по FOR UPDATE.
2. Думаю да, иначе нет смысла в блокировке.
3. Колонки не имеют значения, без Where будут заблокированы все записи в таблице, но не сама таблица.
4. Это не имеет смысла так как блокируются только выбранные записи. К ним Инсерт не применишь.

Спасибо за ответ. Хотел бы уточнить некоторые детали

1. Т.е блокировка вступает в силу если происходит изменение строк, которые подходят по условию в запросе FOR UPDATE, правильно? Если никаких транзакций нет на момент запроса FOR UPDATE или изменения происходят в строках, которые не подходят по условию, блокировок не происходит?
2. Допустим в таблице user_requests идет запись каких-то данных, на каждого юзера может быть только одна строка с status равным 0, как только status в этой строке сменился на 1, ему разрешается делать следующую запись.
Сперва делается SELECT на отсутствие записи с status=0 и после этого делается INSERT. Каким образом можно блокировать SELECT если происходит INSERT в эту таблицу?

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson