|
|
|
SELECT ... FOR UPDATE & JOIN
|
|||
|---|---|---|---|
|
#18+
Нужно обновить счетчик у сообещения (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 в джойне? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 20:02 |
|
||
|
SELECT ... FOR UPDATE & JOIN
|
|||
|---|---|---|---|
|
#18+
eurobaxеще и user в джойне?Угу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 20:19 |
|
||
|
SELECT ... FOR UPDATE & JOIN
|
|||
|---|---|---|---|
|
#18+
Интересно, зачем так крайне неоптимально сделано - еще и напрягание связанных таблиц? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 20:30 |
|
||
|
SELECT ... FOR UPDATE & JOIN
|
|||
|---|---|---|---|
|
#18+
Не говори ерунды. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 20:47 |
|
||
|
SELECT ... FOR UPDATE & JOIN
|
|||
|---|---|---|---|
|
#18+
Пример понял, но он явно не из общей практики ) Я исхожу из такой общей практики: 1. Связей (полей-ссылок) как правило, очень много. 2. Запрос на чтение связанных данных обычно оптимизируется - джойнятся все необходимые данные по связям. 3. В логике приложения изменение происходит только записи из главной таблицы. 4. Если нужно изменение по связям - делаются отдельные запросы, опять же, с отдельными блокировками, которые действительно нужны. Получается, в моем примере блокировать запись messages придется отдельным запросом, чтобы избежать бесполезной блокировки записей из тучи JOIN'ов По ощущениям в MySQL какой-то принцип: "хапни все, либо ничего" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 21:05 |
|
||
|
SELECT ... FOR UPDATE & JOIN
|
|||
|---|---|---|---|
|
#18+
eurobaxПример понял, но он явно не из общей практикиЖаль, что ты не понял, для чего я его привёл. Не существует способа определить, какая из таблиц, отобранных в селекте, будет затем модифицирована апдейтом. eurobaxВ логике приложения изменение происходит только записи из главной таблицы. Нет такого понятия как "главная таблица". Все таблицы равноправны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 21:23 |
|
||
|
SELECT ... FOR UPDATE & JOIN
|
|||
|---|---|---|---|
|
#18+
AkinaНе существует способа определить, какая из таблиц, отобранных в селекте, будет затем модифицирована апдейтом. Вот именно, нафига мне все блокировать? Блокировка - это лишняя нагрузка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 22:37 |
|
||
|
SELECT ... FOR UPDATE & JOIN
|
|||
|---|---|---|---|
|
#18+
eurobaxВот именно, нафига мне все блокировать?А какая альтернатива? Не блокировать? так юзер занафига-то написал FOR UPDATE... Часть блокировать, а часть нет? так ведь хрен его знает, какую часть блочить, какую нет, ибо AkinaНе существует способа определить, какая из таблиц, отобранных в селекте, будет затем модифицирована апдейтом. Что там остаётся-то из вариантов? а только один - блокировать всё. Делаем... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2016, 22:41 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39310652&tid=1831401]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
174ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
| others: | 252ms |
| total: | 541ms |

| 0 / 0 |
