powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / SELECT ... FOR UPDATE & JOIN
9 сообщений из 9, страница 1 из 1
SELECT ... FOR UPDATE & JOIN
    #39310605
eurobax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно обновить счетчик у сообещения (message).
В запросе к сообщению джойним запись пользователя, чтобы узнать имя (для дальнейшей логики).
Делаем блокировку записи на чтение, чтобы избежать коллизий:

SELECT
messages.*,
users.name
FROM messages
LEFT JOIN
users ON users.id =messages.user
WHERE messages.id="1123"
FOR UPDATE

Вопрос вот в чем: заблокирована будет только запись message (id="1123") или еще и user в джойне?
...
Рейтинг: 0 / 0
SELECT ... FOR UPDATE & JOIN
    #39310616
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eurobaxеще и user в джойне?Угу.
...
Рейтинг: 0 / 0
SELECT ... FOR UPDATE & JOIN
    #39310626
eurobax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Интересно, зачем так крайне неоптимально сделано - еще и напрягание связанных таблиц?
...
Рейтинг: 0 / 0
SELECT ... FOR UPDATE & JOIN
    #39310635
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не говори ерунды.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT 
messages.*,
users.name
FROM messages
LEFT JOIN 
users ON users.id =messages.user
WHERE messages.id='1123'
FOR UPDATE;

UPDATE messages
LEFT JOIN 
users ON users.id =messages.user
SET users.status = 'banned'
WHERE messages.id='1123';
...
Рейтинг: 0 / 0
SELECT ... FOR UPDATE & JOIN
    #39310646
eurobax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пример понял, но он явно не из общей практики )
Я исхожу из такой общей практики:
1. Связей (полей-ссылок) как правило, очень много.
2. Запрос на чтение связанных данных обычно оптимизируется - джойнятся все необходимые данные по связям.
3. В логике приложения изменение происходит только записи из главной таблицы.
4. Если нужно изменение по связям - делаются отдельные запросы, опять же, с отдельными блокировками, которые действительно нужны.

Получается, в моем примере блокировать запись messages придется отдельным запросом, чтобы избежать бесполезной блокировки записей из тучи JOIN'ов
По ощущениям в MySQL какой-то принцип: "хапни все, либо ничего"
...
Рейтинг: 0 / 0
SELECT ... FOR UPDATE & JOIN
    #39310652
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eurobaxПример понял, но он явно не из общей практикиЖаль, что ты не понял, для чего я его привёл.
Не существует способа определить, какая из таблиц, отобранных в селекте, будет затем модифицирована апдейтом.
eurobaxВ логике приложения изменение происходит только записи из главной таблицы.
Нет такого понятия как "главная таблица". Все таблицы равноправны.
...
Рейтинг: 0 / 0
SELECT ... FOR UPDATE & JOIN
    #39310671
eurobax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaНе существует способа определить, какая из таблиц, отобранных в селекте, будет затем модифицирована апдейтом.

Вот именно, нафига мне все блокировать?
Блокировка - это лишняя нагрузка
...
Рейтинг: 0 / 0
SELECT ... FOR UPDATE & JOIN
    #39310676
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eurobaxВот именно, нафига мне все блокировать?А какая альтернатива?
Не блокировать? так юзер занафига-то написал FOR UPDATE...
Часть блокировать, а часть нет? так ведь хрен его знает, какую часть блочить, какую нет, ибо
AkinaНе существует способа определить, какая из таблиц, отобранных в селекте, будет затем модифицирована апдейтом.
Что там остаётся-то из вариантов? а только один - блокировать всё. Делаем...
...
Рейтинг: 0 / 0
SELECT ... FOR UPDATE & JOIN
    #39310865
eurobax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По логике, неплох был бы JOIN FOR UPDATE )
Все вопросы бы решил
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / SELECT ... FOR UPDATE & JOIN
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]