
Dmitry
22.10.2018
12:19:56
30 сек - это я с лихвой взял значение прям по таймаут
Обычно ждут секунд пару, а потом "ничего не работает, всё сломалось"
> Вы сейчас про savepoint вы мне пытаетесь рассказать?
Нет. Я говорю о том, как приложения обязаны обращаться с данными и реагировать на SQL states, возвращаемые СУБД, чтобы сохранять ACID-свойства. В данном случае, транзакции, которые получили serialization failure (и подобные states), должны автоматически повторяться.
> Или про всякие мулечки в питоне и прочих?
Какие "мулечки"? Это базовые требования работы с любой ACID (SQL) СУБД. ;)
Если кто-то не работает с ними так, как положено, никакого ACID у Вас не будет в любой, и это уже только его проблемы.
> протокол обработки подобных исключительных ситуаций .... Название у протокола-то есть? ))
Под "протоколом" я имел в виду ряд основных принципов. Не знаю, есть ли у них название...
Если у принципов нет названий - очень похоже, что это доморощенные принципы

Сергей
22.10.2018
12:26:10

Google

Ололо
22.10.2018
12:26:24

Dmitry
22.10.2018
12:26:44

Сергей
22.10.2018
12:28:13
Поясните
как связаны retry при serializable read и ожидание для юзера? если вы вот так юзерские данные пишите, то скорее всего делаете что-то не так
и read commited вам достаточно


Yaroslav
22.10.2018
12:29:34
Т.е. вместо того, чтобы честно показать ошибку, ваше приложение будет бесконечно долбиться к занятым данным и "висеть"? Это вы называете бест прэктис в архитектуре БД? Это уж точно антитребования какие-то
О-хо-хо. :( Т.е. Вы этих принципов не знаете. :( (А ведь это не какие-то там "best practice", это просто основы.)
Я поэтому в начале дискуссии и спрашивал, где Вы (всему) этому научились.
> А если SLA отдачи всей страницы 30 секунд
СУБД общего назначения не являются real-time, и никаких гарантий времени отклика в принципе не дают.
Если у кого-то есть такое требование, ему придётся использовать какой-то другой инструмент, в худшем случае.
> Если у принципов нет названий - очень похоже, что это доморощенные принципы
Да Вы что? ;) Вот из "доморощенного" ISO SQL:
"4.36.5 Implicit rollbacks
The execution of a <rollback statement> may be initiated implicitly by an SQL-implementation when it detects the inability to guarantee the serializability of two or more concurrent SQL-transactions. When this error occurs, an exception condition is raised: transaction rollback — serialization failure."
А вот описание принципов из "доморощенной" документации PostgreSQL:
"When an application receives this error message [serialization failure], it should abort the current transaction and retry the whole transaction from the beginning."
"...it is important that any data read from a permanent user table not be considered valid until the transaction which read it has successfully committed..."
Ну и т.д.
И вообще в любой многопользовательской ACID SQL СУБД действуют всё те же принципы.


Terminator
22.10.2018
12:34:20
@alexfoxsy будет жить. Поприветствуем!

juriy
22.10.2018
12:42:26
господа, подскажите, вот надо запилить сложную процедуру на plpgsql - она берёт данные из разных таблиц, ковыряет их и пишет результат в другие таблицы. Чтобы не путаться в коде, разбиваю её на разные функции. И возникает такая ситуация, что "родительская" функция делает определенные вычисления, в результате которых получается несколько переменных, затем вызывает в цикле дочернюю функцию, которая использует эти переменные. Так вот - как их передать эти переменные, чтобы не пересчитывать их каждый раз при вызове "дочерней" функции в цикле? Создать виртуальную таблицу и передавать её имя? Или крупные объекты передаются по ссылке? Есть ли там что-то вроде copy-on-write optimization?


Yaroslav
22.10.2018
12:47:43
господа, подскажите, вот надо запилить сложную процедуру на plpgsql - она берёт данные из разных таблиц, ковыряет их и пишет результат в другие таблицы. Чтобы не путаться в коде, разбиваю её на разные функции. И возникает такая ситуация, что "родительская" функция делает определенные вычисления, в результате которых получается несколько переменных, затем вызывает в цикле дочернюю функцию, которая использует эти переменные. Так вот - как их передать эти переменные, чтобы не пересчитывать их каждый раз при вызове "дочерней" функции в цикле? Создать виртуальную таблицу и передавать её имя? Или крупные объекты передаются по ссылке? Есть ли там что-то вроде copy-on-write optimization?
Да делали бы Вы как удобнее / логичнее, IMHO.
Вот у Вас уже есть проблемы с производительностью?
> Создать виртуальную таблицу и передавать её имя?
Кстати, что такое "виртуальная таблица"? Temporary? Или переменная/параметр композитного типа?

Алексей
22.10.2018
12:49:44


juriy
22.10.2018
12:52:41
Да делали бы Вы как удобнее / логичнее, IMHO.
Вот у Вас уже есть проблемы с производительностью?
> Создать виртуальную таблицу и передавать её имя?
Кстати, что такое "виртуальная таблица"? Temporary? Или переменная/параметр композитного типа?
проблем нет, более того, забавно - но эту "подсистему" я делаю с одной целью - чтобы можно было частично обновлять материализованный вид, то есть например, есть у нас 200 стран и 100 тысяч городов. в каждой стране нужно посчитать сколько всего городов, и сколько городов, у которых есть те или иные свойства. соответственно, когда меняется запись города - нет смысла обновлять весь материализованный вид, можно обновить только запись одной страны
наверное тогда сделаю действительно как удобнее - в любом случае, ждать несколько минут хуже чем ждать лишние 500мс

Yaroslav
22.10.2018
12:55:08

Google

Andrei
22.10.2018
12:58:14
а чем временные таблицы не угодили? насколько понял, там все в одной транзакции идет

juriy
22.10.2018
12:59:11

Yaroslav
22.10.2018
13:02:34


juriy
22.10.2018
13:02:35
а чем временные таблицы не угодили? насколько понял, там все в одной транзакции идет
да, в одной транзакции держу, причём прикол - там даже 3 режима вызова функции - 1. обновить всё независимо ни от чего, 2. просто посмотреть что подлежит обновлению, 3. обновить только если с последнего вызова не добавилось новых изменений, если они добавились - оборвать транзакцию и сообщить что мол, действие требует участия пользователя
прям так и просится сюда ООП фичи))
да, и при том на этом скрине даже нет таблиц "обслуживаемых компонентов" - они отдельно, в других схемах
да, и самое главное - там удобство очень крутое даётся с таким подходом - в обслуживаемой схеме создаются функции-хендлеры типа country_on_city_attached(), city_on_cnt_streets_changed() и т.д. подсистема ищет эти хендлеры по схемам и если находит, и при этом в таблицах есть какие-то изменения - вызывает нужные хендлеры. таким образом у нас отдельно "обслуживающая" логика и отдельно "клиентская"
а в этих функциях-хендлерах уже в принципе любая логика - можно обновить таблицу, а можно при желании хоть вручную отдельные колонки/записи обновлять, что должно быть очень быстро на огромном кол-ве записей


Dmitry
22.10.2018
13:16:56

bebebe
22.10.2018
13:18:02
как перестать сериализовывать и начать жить

Alexey
22.10.2018
13:18:51
Yaroslav, зачем в аббревиатуре ACID буковку I отделили от буквоки C?
Вообще под консистентностью я понимал всегда следующее: соблюдение констрейтов в базе (FK, not null, check).

Dmitry
22.10.2018
13:19:11

Yaroslav
22.10.2018
13:19:52

Alexey
22.10.2018
13:20:12

Yaroslav
22.10.2018
13:21:04

Alexey
22.10.2018
13:21:07
+++
Я в целом согласен с Ярославом)

Dmitry
22.10.2018
13:22:15

Yaroslav
22.10.2018
13:23:35

Google

Dmitry
22.10.2018
13:24:08
Изоляция определяет область видимости данных, для транзакций, которые выполняются параллельно. Вот цель изоляции.

Alexey
22.10.2018
13:27:42
https://t.me/pgsql/104679
Как бы могли бы и не разделять C и I из-за этого. Сказали бы не full AID или не full ACD, если какие-то констрейты не соблюдаются.

Yaroslav
22.10.2018
13:29:40

Lestat -
22.10.2018
13:30:50
#приоритезация_юзераф
Друзья, фсех с панидельникам!
Подскажите пожалуйста в какую сторону смотреть/что почитать
Задача? :
Нужна приоритезация доступа пользователей к базе, т.е. в случае когда фсе забыли позакрывать коннекты и исчерпали лимит, наши клиенты всегда могли зайти

Yaroslav
22.10.2018
13:32:13

Andrei
22.10.2018
13:32:32
Лимитировать количество соединений по-юзверно + баунсер

Dmitry
22.10.2018
13:40:33

Alexey
22.10.2018
13:40:49
Вот и вопрос, зачем их делили, когда они как бы все связаны.
Вообщем, понятно, что вам это неизвестно, поскольку не вы стандарт SQL писали. Или я чего-то не знаю про вас?)

Dmitry
22.10.2018
13:44:22
Давайте зайдем с другого бока. Вот у нас однопользовательская БД. Там работает один пользователь. Всё сериализовано. Как по вашему, она может быть не консистентной?

Yaroslav
22.10.2018
13:45:08
Так изоляция и происходит за счет видимости, за счет того, какую версию тапла вам показывают.
Во-первых, отчасти (есть ещё предикатные блокировки, и serialization failures, и deadlocks).
Во-вторых, только в нашей СУБД. А другие вообще не обязаны использовать версии (да и блокировки, если уж на то пошло), и не обязаны обеспечивать какую-то видимость (не считая требуемого стандартом исключения lost updates). Т.е., если serialializability достигается, то уже всё равно, что и кому там было видно. ;)

Dmitry
22.10.2018
13:47:25

Lestat -
22.10.2018
13:49:32

Yaroslav
22.10.2018
13:51:41

Dmitry
22.10.2018
13:59:02


Yaroslav
22.10.2018
14:07:03
Никаких интуитивных смыслов. Вам было дано четкое определение одного из основоположников теории БД. Примерно такого же как Кодд. Вы мне так и не объяснили чем консистентность в ACID отличается от таковой в CAP
> Никаких интуитивных смыслов.
То есть, слов "консистентность", "согласованность", "корректность" в других смыслах никто из нас не употреблял? ;)
> Вам было дано четкое определение одного из основоположников теории БД. Примерно такого же как Кодд.
Ну-ну. Отчего же другие теоретики называют многие его воззрения, как минимум, экстремальными? ;)
И "определение" это плохое.
Во-первых:
Any data written to the database must be valid according to all defined rules, including constraints, cascades, triggers, and any combination thereof.
А что мы оттуда можем считать, значит, неважно?
И ещё, что значит, конкретно:
must be valid according to ... triggers?
> Вы мне так и не объяснили чем консистентность в ACID отличается от таковой в CAP
Они вообще из разных иерархий. В CAP вообще никаких транзакций нет, а consistency определяется как linearilizability отдельных значений в распределённой системе, если я ещё правильно помню (мне эта тема не очень интересна, извините).

Google

Terminator
22.10.2018
14:17:17
@anton_lar будет жить. Поприветствуем!

Anton
22.10.2018
14:18:32
Выдаёт ошибку

Alex
22.10.2018
14:19:18
Говорят такого файла нету

Anton
22.10.2018
14:20:06

Alexander
22.10.2018
14:21:55
Дружище, проверь наличие файла и его зазвание в точности до символа.
Если не поможет посмотри права на чтение.
Если и это не поможет, тогда попробуй спросить где нить ещё

Bogdan
22.10.2018
14:22:19
Помести файл в друное место, наверно на каталог юзера прав нет
И научись скрины делать)
Эм, каталог русскими буквами "Питон"

Андрей
22.10.2018
14:32:04
в винде вроде как можно полный путь до файла скопировать (shift и правый клик мыши по файлу)

Alex
22.10.2018
14:36:02
Ребята, а кто как проверяет поднятие сервиса при автоматическом тесте бекапа ? ну то что он поднялся корректно ? парсинг лога или еще как ?

Anton
22.10.2018
14:36:03

Maxim
22.10.2018
14:41:46
Теперь пишет permission denied
Паучье чутьё подсказывает, что у юзера, с которым запускается постргес, нет прав на доступ к файлам, которые, вероятно, созданы другим юзером.

Anton
22.10.2018
14:42:14

Maxim
22.10.2018
14:42:59

Terminator
22.10.2018
14:59:13
@Molly_Malone будет жить. Поприветствуем!

Molly
22.10.2018
15:01:29
Нужен совет как избавиться от кавычек
cursor2.execute('''SELECT chat_id FROM users_info WHERE %s ILIKE %s ''', (parameter_for_filter, filter ))
Где
parameter_for_filter='salon'
Получается
"SELECT chat_id FROM users_info WHERE 'salon' ILIKE 'g%' "

Google

Molly
22.10.2018
15:02:51
Буду весьма признателен

Yaroslav
22.10.2018
15:03:48

Molly
22.10.2018
15:04:12
Это название столбца

Sab0
22.10.2018
15:04:31
ребят, кто в курсе почему если прописывать айпишники в конфиге, то удаленный коннект не срабатывает?
если прописываю вместо айпишников * срабатывает, но это как-то небезопасно

Maxim
22.10.2018
15:12:05
Нужен совет как избавиться от кавычек
psycopg2 не позволяет вставлять идентификаторы без экранирования.
Вам надо что-то вроде
execute('select * where {} ilike %s'.format(sql.Identifier(parameter_for_filter)), (filter,))

Yaroslav
22.10.2018
15:13:38
У Вас PostgreSQL дожен слушать на три сетевых интерфейсах (адресах)?
Или что именно не срабатывает?

Sab0
22.10.2018
15:14:13