Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / SELECT ... FOR UPDATE & JOIN / 9 сообщений из 9, страница 1 из 1
16.09.2016, 20:02
    #39310605
eurobax
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT ... FOR UPDATE & JOIN
Нужно обновить счетчик у сообещения (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
16.09.2016, 20:19
    #39310616
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT ... FOR UPDATE & JOIN
eurobaxеще и user в джойне?Угу.
...
Рейтинг: 0 / 0
16.09.2016, 20:30
    #39310626
eurobax
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT ... FOR UPDATE & JOIN
Интересно, зачем так крайне неоптимально сделано - еще и напрягание связанных таблиц?
...
Рейтинг: 0 / 0
16.09.2016, 20:47
    #39310635
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT ... FOR UPDATE & JOIN
Не говори ерунды.
Код: 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
16.09.2016, 21:05
    #39310646
eurobax
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT ... FOR UPDATE & JOIN
Пример понял, но он явно не из общей практики )
Я исхожу из такой общей практики:
1. Связей (полей-ссылок) как правило, очень много.
2. Запрос на чтение связанных данных обычно оптимизируется - джойнятся все необходимые данные по связям.
3. В логике приложения изменение происходит только записи из главной таблицы.
4. Если нужно изменение по связям - делаются отдельные запросы, опять же, с отдельными блокировками, которые действительно нужны.

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

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


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