172 похожих чатов

А есть в Postgres что-то близкое по скорости к CompareAndAdd?

Возможно за счёт durability?
Сейчас клиенты приходят в много потоков и число запросов обновляется в таблице. Со всем развесистым деревом локов.

19 ответов

28 просмотров

Вряд ли получится что-то лучшее, чем READ COMMITTED + unlogged table. Но от одной инструкции процессора (если Вы это имели в виду) это всё очень далеко, разумеется.

Sergey-Gr Автор вопроса

Да, я что-то подобное атомарным инструкциям и имел в виду. ReadCommitted тут получается не очень хорош: пришли 10 клиентов, считали из таблицы значение счётчика 99 и пошли делать полезную работу. Затем со всеми необходимыми блокировками выстраиваясь в очередь прибавили по единичке и получили в таблице 109. А положено не больше 100.

Sergey Gr
Да, я что-то подобное атомарным инструкциям и имел...

> прибавили по единичке и получили в таблице 109. Как и должно быть, нет (99 + 10 = 109)? > А положено не больше 100. Почему?!

Sergey-Gr Автор вопроса
Yaroslav Schekin
> прибавили по единичке и получили в таблице 109. ...

Бизнес-требования. С точки зрения уровней изоляции всё верно. Поэтому и ищем что-то и пошустрее и поточнее.

Sergey Gr
Бизнес-требования. С точки зрения уровней изоляции...

Так а что с остальными 9 клиентами должно случиться-то в этом примере?

Sergey-Gr Автор вопроса
Yaroslav Schekin
Так а что с остальными 9 клиентами должно случитьс...

Если работать на уровне serializable, то все кроме первого на этапе чтения из таблицы счётчика получили бы 100 и вернули клиенту ошибку

Да. Если это то, что Вам нужно (только нужно быстрее) — Вы занимаетесь реализацией очереди, разве нет? Если так, то с них и надо "сдирать" — см. для начала http://johtopg.blogspot.com/2015/01/queues-queues-they-all-fall-down.html А вообще лучше смотреть на код готовых реализаций — есть немало неочевидных трюков, влияющих на их производительность.

Sergey-Gr Автор вопроса
Yaroslav Schekin
Да. Если это то, что Вам нужно (только нужно быстр...

Не очередь, счётчик. Это должно быть проще

Sergey Gr
Не очередь, счётчик. Это должно быть проще

Т.е. если счётчик = 15, например, то 10 задач должны использовать эту запись, и по их завершении должно стать 25? (Я не понимаю, в чём именно проблема — в ограничении максимума или предотвращении одновременной обработки?)

Sergey-Gr Автор вопроса

В ограничении максимума при приемлемой скорости работы

Sergey Gr
В ограничении максимума при приемлемой скорости ра...

Хмм... т.е. Вам нужно, чтобы данная запись была в итоге обработана ровно (не больше и не меньше) 100 раз, если это вообще возможно, я правильно понял задачу?

Sergey-Gr Автор вопроса

Не больше 100. Меньше можно

Sergey Gr
Не больше 100. Меньше можно

Т.е., для примера, счётчик был 95, пришло 7 сессий, 3 откатились по своим внутренним причинам, а ещё одна — потому, что счётчик (с учётом откатившихся транзакций) стал = 100, и это нормальная ситуация (т.е. 95 + 3 реально отработавших → счётчик = 100)?

Ну так https://t.me/pgsql/474680, нет?

Sergey-Gr Автор вопроса
Yaroslav Schekin
Ну так https://t.me/pgsql/474680, нет?

Да, интересный вариант. Но надо аккуратно разобраться с кешированием сиквенса в сессии. И по сути это же честная транзакция? Со всеми полагающимися локами?

Sergey Gr
Да, интересный вариант. Но надо аккуратно разобрат...

> Но надо аккуратно разобраться с кешированием сиквенса в сессии. Ну Вы же согласились "терять" значения — казалось бы, какая уже разница? ;) А так-то по умолчанию они не кешируются. Так что значения будут теряться только при ROLLBACK и crash recovery, по идее. > И по сути это же честная транзакция? Что, nextval()? Нет, там locks не удерживаются — это как раз неатомарный счётчик.

Sergey Gr
Да, я что-то подобное атомарным инструкциям и имел...

Ну, можно сделать таблицу с жэтонами на остаток constraint, и выдавать эти жэтоны через SELECT ... FOR UPDATE SKIP LOCKED. Само изменение -- тожэ записывать в жэтоны (те жэ, или другие) и потом собирать их обратно в итоговый регистр, на который висит constraint.

Yaroslav Schekin
Так а что с остальными 9 клиентами должно случитьс...

На самом деле -- он пример не очень показательный привёл. Лучшэ видно -- если, допустим, значение у нас 80, constraint на <100, и 25 рабочих процэссов хотят отработать увеличение +1. В итоге, если сделать по дефолту -- процэсс обновляет регистр, на регистре висит constraint -- то все 25 процэссов будут выполняться последовательно (последние 5 при этом откажутся работать). Логически всё правильно, но отсутствие параллелизма удручает. Хотелось бы, чтобы первые 20 отработали параллельно, а остальные -- или отказались сразу или отказались после их завершэния.

Ilya Anfimov
На самом деле -- он пример не очень показательный ...

Так кончилось-то вот этим, вроде: https://t.me/pgsql/474690

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта