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

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

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

19 ответов

25 просмотров

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

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта