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

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

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

19 ответов

9 просмотров

Вряд ли получится что-то лучшее, чем 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

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

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

кому не сложно распишите пожалуйста для какой цели тут вот эти скобки и в них пихается указатель?
Михаил Helper
15
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Комрады, посоветуйте, куда копать? Стал прикручивать кастомизацию тем. В OnShow главной главной формы пытаюсь загрузить из файла настроек и применить тему (на скрине, как долж...
Ed Doc
13
Такс, блин, таки кто-то знает, каким образом работают макросы stdin/stdout/stderr? Я влез в stdio.h, там определения нет, отладил через асмокод - вызывается функция со странны...
The Bird of Hermes
18
OnShow один раз вызывается? или возможен Hide?
Iluha Companets
14
Hi, I have a partitioned table in Postgres that has a composite primary key on 3 columns out of which two columns are partition key columns. Now I have a requirement to add a ...
Sujith
1
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Если у меня есть такой класс: Object = {} function Object:new(a_name, a_transform, a_color, a_mesh, a_material, a_shader, a_textures) local private = {} private.n...
Cuarno Vile
4
Всем привет, на линуксе лучше на fasm или nasm учиться писать для начала ?
meszjol
14
@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
Карта сайта