Допустим, у нас так:
Album Photo
+----+-----------------+ +----+-------------------+
| id | name | | id | album_id | number |
+----+-----------------+ +----+----------+--------+
| 1 | outsession'16 | | 1 | 2 | 1 |
| 2 | new year'17 | | 2 | 2 | 2 |
| 3 | man'ka's deanon | | 3 | 1 | 1 |
+----+-----------------+ | 4 | 3 | 1 |
^ | 5 | 1 | 2 |
| | 6 | 3 | 2 |
| | 7 | 2 | 3 |
| +----+-------------------+
| |
+-------------------------------+
Зачем Photo.number? Например, хотим урлы /albums/:album_id/:photo_number
(/albums/1/1, /albums/1/2, /albums/2/1, /albums/2/2, …, ну ты понел)
Внимание, вопрос: как нам обеспечить вставку записей в Photo со строго последовательными и неизменяемыми (фотки можно удалять) number?
Да, у нас «хуйлоад», тыща бнвачеров ломится заливать фоточки в альбом с деаноном маньки. Без использования очередей. Только наш любимый язычок и постгрес. Триггеры можно, но нежелательно — хуёво поддерживаются, неочевидные, нет интеграции в ORM, и т.д.
Только давайте для начала предоставим слово маньке. Он тут рассказывал, какой он специалист по RDBMS и постгресу в частности. Ну а когда манька соснёт и нелепо сольётся, выслушаем комарика.
```
хуячишь уникальный индекс и вставляешь с
MAX(number+1)
@anonymous (индекс
album_id, number
обв)@komar не уверен что с локами на альбом будет лучше
@komar Само собой это уже сделано,
unique_together = ('album', 'number')
@komar Подожди, почему только на строку? Я пока в лоб просто нахуй всю таблицу лочу с самым агрессивным локом (ACCESS EXCLUSIVE то есть). Ты предлагаешь лочить только строку с максимальным number? Так ведь после того, как первый отпустит лок, будет строка с max+1 (которую первый только что вставил), и второй получит не максимальный, а минус один, которая была залочека, разве нет?
@komar А проёбаные вставки и ошибки откуда возьмутся? // повтор обосравшихся вставок подразумевался в комментарии выше
@ckorzhik > FOR UPDATE
Дальше объяснять, где ты обосрался?
@anonymous ты тупой шоле, в альбомы добавляется колоночка max_number и лочится альбом.
@komar nextval не быстрее будет?
@komar Но ведь в пг нет READ UNCOMMITTED, соответственно, два треда сделают прочитают один и тот же number_sequence FROM albums (например, 100), и апдейтнут его на 101, разве нет? Или ты там имел в виду SELECT FOR UPDATE? Или я что-то не понимаю?
@anonymous тупой шоле, это не sequence
@ckorzhik А, сорь, читал комментарии не деревом и не так тебя понял, всё верно.
Делаешь CREATE SEQUENCE на каждый альбом и получаешь number через nextval // наркоман-тян
@anonymous Да хули вы так быстро отвечаете, я про альбомы пропустил, думал, вы тут строку с максимальным number в фотках лочить хотите.
Вообще-то я маньку экзаменировал, ппц вы.
@anonymous >implying по поводу маньки ещё чтото не ясно
@anonymous Заёбно через ORM это делать, да и вообще от этих последовательностей иногда боль, пишешь миграцию, которая копирует данные из одной в модели (= таблицы), у тебя там на какой-нибудь колонке sequence, так потом приходится всё равно хуячить дополнительную миграцию, которая сырым скулем (потому что орм в такое не умеет, конечно), переинициализирует сиквенс, чтобы nextval был max(…)+1. Ну это всё боль орма, канеш.
Спасибо комару, можно расходиться.
@anonymous Всегда так и делал!
@komar и? Делаем retry и всё замечательно вставляется.
@krkm Затем, что ты куркума и читаешь жопой.
@krkm В ТРЕД ВРЫВАЕТСЯ ДЖАВАСКРИПТ
@krkm > со строго последовательными и неизменяемыми (фотки можно удалять)
inb4 WHERE is_deleted = false и не удалять строки их таблицы фоток никогда.
@je > Дак и нахуй делать 1,2,3 на каждый альбом, об этом было в постановке опа?
Да ебать тебя в рот, ты совсем отсталый, что ли, русский язык даже не понимаешь?
@je > offset
Да откуда ты оффсет высрал-то, блядь? Ни слова про листалку в оп-посте не было. А был темплейт урлов и примеры этих урлов с пояснением, зачем оно вообще надо.
@je Что ты несёшь, мань? В оп-посте была максимально конкретная задача. Комар решил задачу минут за 10 оптимальнейшим (на мой непрофессиональный взгляд) способом. Нахуй ты дерейлишь тут?
@je > но в oracle это называется isolation levels
Именно в оракл! Уникально-инновационная фича! Нигде такого не было? Что? Какой ещё ANSI SQL?.. Это новая база? Где скочать???
@je >СУБД сама сериализует доступ
TIL кто-то в реальной жизни использует
ISOLATION LEVEL SERIALIZABLE
@je сука, блять, как научится так же умело скатывать треды?
ура, прочитал весь тред // прочитал
мань, погугли mvcc, авось где-то в будующем у тебя будет шанс не обосраться и хотя бы говорить верные термины
@anonymous Оно всё равно работает не так (в постгресе), как следует из названия, и не обеспечивает строго последовательное выполнение транзакционных блоков.