|
Семь синих
|
|||
---|---|---|---|
#18+
Задачка. Как это сделать средствами Постгреса? Сделать таблицу и навесить средствами Постгреса что нужно, чтобы в таблице могли храниться некие записи с атрибутом цвет и чтобы в таблицу можно было вписать не более семи синих. С другой стороны - найти прокол в этом решении, какими последовательностями команд (с какого psql если их несколько) можно вписать восьмой синий. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 15:03 |
|
Семь синих
|
|||
---|---|---|---|
#18+
Этот поток сознания расшифровывается как-то? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 15:11 |
|
Семь синих
|
|||
---|---|---|---|
#18+
mad_nazgul, enum тут ни при чём. Человек хочет constraint, ограничивающий количество строк в таблице. ну я, только триггеры. on before insert or update. Что-то похожее описано тут — в таблицу добавлена служебная колонка с CHECK-constraint, которая заполняется в триггере. Чтобы не добавлять лишнюю колонку — можно выбрасывать ошибку сразу из триггера. Чтобы «вписать восьмой синий», достаточно будет [временно] отключить триггер. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 16:00 |
|
Семь синих
|
|||
---|---|---|---|
#18+
ну яЗадачка. Как это сделать средствами Постгреса? Сделать таблицу и навесить средствами Постгреса что нужно, чтобы в таблице могли храниться некие записи с атрибутом цвет и чтобы в таблицу можно было вписать не более семи синих. Так, что ли? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
ну яС другой стороны - найти прокол в этом решении, какими последовательностями команд (с какого psql если их несколько) можно вписать восьмой синий. Отключить триггер, любым способом (быть owner или superuser, например). ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 16:07 |
|
Семь синих
|
|||
---|---|---|---|
#18+
PgSQLanonymous3, В базе лежит 6 синих записей. Два процесса видят, что можно добавить. Берут и вставляют по одной своей. Получаем 8. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 18:06 |
|
Семь синих
|
|||
---|---|---|---|
#18+
ну яPgSQLanonymous3, В базе лежит 6 синих записей. Два процесса видят, что можно добавить. Берут и вставляют по одной своей. Получаем 8. При уровне изоляции serializable один из них вылетит с ошибкой сериализации. -- Maxim Boguk dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 18:39 |
|
Семь синих
|
|||
---|---|---|---|
#18+
ну яPgSQLanonymous3, В базе лежит 6 синих записей. Два процесса видят, что можно добавить. Берут и вставляют по одной своей. Получаем 8. Если Вам это каким-то подобным образом удастся с приведённым мной триггером, можете смело писать bug report в проект PostgreSQL. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 18:49 |
|
Семь синих
|
|||
---|---|---|---|
#18+
PgSQLanonymous3ну яPgSQLanonymous3, В базе лежит 6 синих записей. Два процесса видят, что можно добавить. Берут и вставляют по одной своей. Получаем 8. Если Вам это каким-то подобным образом удастся с приведённым мной триггером, можете смело писать bug report в проект PostgreSQL. Я бы кстати забил бы на serializable уровень и сделать бы lock table items_with_colors в начале триггера просто или (что правильнее) advisory lock бы повесил для сериализации обработки триггеров. -- Maxim Boguk dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 18:58 |
|
Семь синих
|
|||
---|---|---|---|
#18+
Maxim BogukЯ бы кстати забил бы на serializable уровень А с какой целью Вы бы это сделали, если не секрет? Перерешить (и, возможно, не решить) решённую задачу? Maxim Boguk и сделать бы lock table items_with_colors в начале триггера просто Зачем? Сериализовать вставку, даже если это не нужно (могут же не только синие вставляться)? Maxim Bogukили (что правильнее) advisory lock бы повесил для сериализации обработки триггеров. Чтобы создать систему костылей и подпорок? Т.е. потом как-то распределять пространство advisory locks между подобными триггерами (которые могут быть на многих таблицах) и прочими возможными функциями, которые их используют? ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 19:44 |
|
Семь синих
|
|||
---|---|---|---|
#18+
PgSQLanonymous3, Чтобы не заставлять вставку делать только через serializable (что далеко не всегда реально если нет возможности поправить вызывающее вставку приложение или по каким то причинам это делать не желательно). Т.е. чтобы не требовалась модификация работающего с таблицей кода. -- Maxim Boguk dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 19:51 |
|
Семь синих
|
|||
---|---|---|---|
#18+
ну я, Для решения надо делать очередь. Как — это на усмотрение, мне приходит в голову: 1. создать таблицу с цветами и делать SELECT FOR UPDATE цвету, чтобы никто другой не мог вставить такой цвет в параллель. 2. рекомендательные блокировки, также можно по ID цвета во вспомогательной таблице или по константе 3. SERIALIZABLE: сначала проверяем, потом вставляем 4. Триггер 5. Блокировать таблицу целиком ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2018, 20:11 |
|
Семь синих
|
|||
---|---|---|---|
#18+
vyegorovну я, Для решения надо делать очередь. Как — это на усмотрение, мне приходит в голову: 1. создать таблицу с цветами и делать SELECT FOR UPDATE цвету, чтобы никто другой не мог вставить такой цвет в параллель. 2. рекомендательные блокировки, также можно по ID цвета во вспомогательной таблице или по константе 3. SERIALIZABLE: сначала проверяем, потом вставляем 4. Триггер 5. Блокировать таблицу целиком Сенкс, стало понятнее. Еще вопрос про откат транзакции. Типа процесс удалил синий, второй вставил, первый роллбек. Я правильно понимаю, что второй в постгресе не увидит удаления? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.06.2018, 18:04 |
|
|
start [/forum/topic.php?fid=53&msg=39664444&tid=1995708]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 149ms |
0 / 0 |