powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Блокировка записей от чтения
22 сообщений из 22, страница 1 из 1
Блокировка записей от чтения
    #39241021
В PostgreSQL реализована модель когда читающие транзакции не блокируют пишущие.
Как организовать в таком случае блокировку от чтения определенного набора строк в таблице, на то время пока другая транзакция их прочитала и пишет в таблицу? Или я просто не совсем понял смысл работы "версионного механизма".
...
Рейтинг: 0 / 0
Блокировка записей от чтения
    #39241033
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тимошенко Александр,

А что конкретно вы делаете, можете привести пример?
...
Рейтинг: 0 / 0
Блокировка записей от чтения
    #39241068
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тимошенко АлександрВ PostgreSQL реализована модель когда читающие транзакции не блокируют пишущие.
Как организовать в таком случае блокировку от чтения определенного набора строк в таблице, на то время пока другая транзакция их прочитала и пишет в таблицу? Или я просто не совсем понял смысл работы "версионного механизма".

Не совсем понято что значит блокировка от чтения и главное зачем она вам нужна.
Объясните что вы хотите сделать на примере.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Блокировка записей от чтения
    #39241106
Для примера система складского партионного учета, надо выбрать данные о остатках, потом сформировать записи "расхода", проставив в них партии по фифо из остатков, потом записать их. Другие транзакции таблицу(не всю конечно, а по данному складу и данной номенклатуре) пока все это происходить читать не должны.
...
Рейтинг: 0 / 0
Блокировка записей от чтения
    #39241109
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тимошенко АлександрДля примера система складского партионного учета, надо выбрать данные о остатках, потом сформировать записи "расхода", проставив в них партии по фифо из остатков, потом записать их. Другие транзакции таблицу(не всю конечно, а по данному складу и данной номенклатуре) пока все это происходить читать не должны.

Хоть убейте не понял почему "Другие транзакции таблицу(не всю конечно, а по данному складу и данной номенклатуре) пока все это происходить читать не должны"?
Пока вы транзакцию не commit никто этих изменений не увидит ни при каких условиях.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Блокировка записей от чтения
    #39241112
Maxim BogukТимошенко АлександрДля примера система складского партионного учета, надо выбрать данные о остатках, потом сформировать записи "расхода", проставив в них партии по фифо из остатков, потом записать их. Другие транзакции таблицу(не всю конечно, а по данному складу и данной номенклатуре) пока все это происходить читать не должны.

Хоть убейте не понял почему "Другие транзакции таблицу(не всю конечно, а по данному складу и данной номенклатуре) пока все это происходить читать не должны"?
Пока вы транзакцию не commit никто этих изменений не увидит ни при каких условиях.

--
Maxim Boguk
www.postgresql-consulting.ru

Ну как. у вас на складе 10 шт товара А (5 партий во остатке)
А пр1 - 2 шт
А пр2 - 2 шт
А пр3 - 2 шт
А пр4 - 2 шт
А пр5 - 2 шт


2 транзакции хотят списать данные, скажем каждая хочес писать по 2 шт товара А

1. тр1 Читает данные об остатках - видит картину выше списывает 2 шт из пр1
2. тр2 Читает данные об остатках - видит картину выше списывает 2 шт из пр1
3. тр1 записывает в таблицу расход, и меняет остатки
4. тр2 записывает в таблицу расход, и меняет остатки


В итоге у нас минус по первой партии
...
Рейтинг: 0 / 0
Блокировка записей от чтения
    #39241130
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тимошенко Александр,

А почему вы думаете, что "меняет остатки" должно что-то изменить в таблице, а "списывает" не должно?
Если вы сделаете всё в рамках транзакций, то у вас возникнет конфликт писателей, и всё будет правильно.
...
Рейтинг: 0 / 0
Блокировка записей от чтения
    #39241140
vyegorovТимошенко Александр,

А почему вы думаете, что "меняет остатки" должно что-то изменить в таблице, а "списывает" не должно?
Если вы сделаете всё в рамках транзакций, то у вас возникнет конфликт писателей, и всё будет правильно.

Немного не точно выразился, запись в таблицу(списание), это и есть "меняет остатки"

Грубо говоря будет так
тр1 SELECT
тр2 SELECT
тр2
тр2 SELECT
...
Рейтинг: 0 / 0
Блокировка записей от чтения
    #39241141
Тимошенко АлександрvyegorovТимошенко Александр,

А почему вы думаете, что "меняет остатки" должно что-то изменить в таблице, а "списывает" не должно?
Если вы сделаете всё в рамках транзакций, то у вас возникнет конфликт писателей, и всё будет правильно.

Немного не точно выразился, запись в таблицу(списание), это и есть "меняет остатки"

Грубо говоря будет так
тр1 SELECT
тр2 SELECT
тр2
тр2 SELECT

Грубо говоря будет так
тр1 SELECT
тр2 SELECT
тр2 INSERT
тр2 INSERT


Проблема в том что первые два селекта считают одинаковые состояния таблицы
...
Рейтинг: 0 / 0
Блокировка записей от чтения
    #39241185
IgorNK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Записываете транзакцией. В момент записи делаете проверку. Если не хватает, откатываете все назад, обновляете данные клиенту и говорите ему: "Ты не успел, Вася. Петя был шустрее."
...
Рейтинг: 0 / 0
Блокировка записей от чтения
    #39241212
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тимошенко АлександрДля примера система складского партионного учета, надо выбрать данные о остатках, потом сформировать записи "расхода", проставив в них партии по фифо из остатков, потом записать их. Другие транзакции таблицу(не всю конечно, а по данному складу и данной номенклатуре) пока все это происходить читать не должны.рассуждение про сферические транзакции в вакууме. на сферически организованной структуре.
любителям сферических блокировок есть transaction isolation lavel serializable (надеюсь не описался -- не держу в памяти за ненадобностью).

для разведения проблемы при рид коммитеде -- делаете изменение остатков инкрементально, наваривая только что тут же (в том же стейтменте) прочитанный остаток. второй пришедший к записи встанет на неё в очередь. и запишет свой инкремент только на закомиченное значение.

если же логика сложна и развесиста -- т.е .читаете вы в одном месте, потом долго считаете, потом навариваете, уже сильно забыв, что читали -- то есть select for update -- для организации очереди потенциальных писателей в момент первого прочтения. и unique -- для организации очереди на insert. ...и т.п. и т.д. например т.к. insert no wait нет -- там, при необходимости делается адвайзори лок.... т.е. мыслите в терминах подхода к снаряду. разделяемому сиречь ресурсу -- и всё наладится.
...
Рейтинг: 0 / 0
Блокировка записей от чтения
    #39241243
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тимошенко АлександрВ PostgreSQL реализована модель когда читающие транзакции не блокируют пишущие.
Как организовать в таком случае блокировку от чтения определенного набора строк в таблице, на то время пока другая транзакция их прочитала и пишет в таблицу? Или я просто не совсем понял смысл работы "версионного механизма".


удалить на время ненужные для просмотра записи.
...
Рейтинг: 0 / 0
Блокировка записей от чтения
    #39241246
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще можно сделать флаг возможности просмотра, и по нему фильтровать.

при изменении записей делать это в три транзакции: сначала убрать флаг возможности просмотра, потом сделать нужные действия, потом поставить флаг обратно.
...
Рейтинг: 0 / 0
Блокировка записей от чтения
    #39241294
IgorNKЗаписываете транзакцией. В момент записи делаете проверку. Если не хватает, откатываете все назад, обновляете данные клиенту и говорите ему: "Ты не успел, Вася. Петя был шустрее."
Да, партия 1 уже списана, и тогда вася спросит, ведь есть же еще партия 2 и при чем тут петя? Партии то подбирает алгоритм.
...
Рейтинг: 0 / 0
Блокировка записей от чтения
    #39241295
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivеще можно сделать флаг возможности просмотра, и по нему фильтровать.

при изменении записей делать это в три транзакции: сначала убрать флаг возможности просмотра, потом сделать нужные действия, потом поставить флаг обратно.ыыыы

логический лок называется.

но одного флага для него мало.
нужно ещё метку времени. и автора захвата (гуид, скажем) и либо джоб по очистке протухших флагов, либо договоренность о считании протухших -- недействительными (со всеми прелестями в виде сдвига сервреного времени одмином. внезапно).
поскольку сделал он 1. и вышел из сеанса снятием приложения. И вот оно навечно замуровано.
и да, -- с обязательной проверкой на 2-м этапе актуальности "логической блокировки" в момент записи (именно за этим сеансом -- гуидом), а не только в момент чтения. (а то прочитают, и пойдут обедать а там и баиньки, лок записи протухнет, кто--то её опять захватит и запишет своё, ну и т.д., а тут старичок вернётся -- и закоммитит давно не актуальный расчёт)

и да -- флаги с причиндалами сделать отдельной таблицей, и её вакуумировать и даже full вакуумировать нещадно. ибо движок ей надобен бы блокировочный, безверсионый, ан его и нет.
...
Рейтинг: 0 / 0
Блокировка записей от чтения
    #39241297
qwwqТимошенко АлександрДля примера система складского партионного учета, надо выбрать данные о остатках, потом сформировать записи "расхода", проставив в них партии по фифо из остатков, потом записать их. Другие транзакции таблицу(не всю конечно, а по данному складу и данной номенклатуре) пока все это происходить читать не должны.рассуждение про сферические транзакции в вакууме. на сферически организованной структуре.
любителям сферических блокировок есть transaction isolation lavel serializable (надеюсь не описался -- не держу в памяти за ненадобностью).

для разведения проблемы при рид коммитеде -- делаете изменение остатков инкрементально, наваривая только что тут же (в том же стейтменте) прочитанный остаток. второй пришедший к записи встанет на неё в очередь. и запишет свой инкремент только на закомиченное значение.

если же логика сложна и развесиста -- т.е .читаете вы в одном месте, потом долго считаете, потом навариваете, уже сильно забыв, что читали -- то есть select for update -- для организации очереди потенциальных писателей в момент первого прочтения. и unique -- для организации очереди на insert. ...и т.п. и т.д. например т.к. insert no wait нет -- там, при необходимости делается адвайзори лок.... т.е. мыслите в терминах подхода к снаряду. разделяемому сиречь ресурсу -- и всё наладится.

select for update наверное то что надо. Но вопрос в пространств которое он заблокирует, всю таблицу или только записи попавшие в выборку?
...
Рейтинг: 0 / 0
Блокировка записей от чтения
    #39241303
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тимошенко АлександрIgorNKЗаписываете транзакцией. В момент записи делаете проверку. Если не хватает, откатываете все назад, обновляете данные клиенту и говорите ему: "Ты не успел, Вася. Петя был шустрее."
Да, партия 1 уже списана, и тогда вася спросит, ведь есть же еще партия 2 и при чем тут петя? Партии то подбирает алгоритм.ну вот, вы сами определились -- нужна очередь в подходах к фифу. т.е. записям партионного учета.
вот и говорите "селект форе апдейт" в момент подхода к ним и пети и васи. пришел вася -- встал в очередь, потому, что петя не отпустил еще коммитом или ролбаком.
отпустит -- тут их вася и прочитает "для апдейту". и надругается разно.
...
Рейтинг: 0 / 0
Блокировка записей от чтения
    #39241307
qwwqТимошенко Александрпропущено...

Да, партия 1 уже списана, и тогда вася спросит, ведь есть же еще партия 2 и при чем тут петя? Партии то подбирает алгоритм.ну вот, вы сами определились -- нужна очередь в подходах к фифу. т.е. записям партионного учета.
вот и говорите "селект форе апдейт" в момент подхода к ним и пети и васи. пришел вася -- встал в очередь, потому, что петя не отпустил еще коммитом или ролбаком.
отпустит -- тут их вася и прочитает "для апдейту". и надругается разно.

Вопрос еще с пространством блокировки
если петя списывает товар А
а вася товар Б

то они не должны друг друга блокировать, SELECT FOR UPDATE справиться с этим?
...
Рейтинг: 0 / 0
Блокировка записей от чтения
    #39241309
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тимошенко Александрqwwqпропущено...
ну вот, вы сами определились -- нужна очередь в подходах к фифу. т.е. записям партионного учета.
вот и говорите "селект форе апдейт" в момент подхода к ним и пети и васи. пришел вася -- встал в очередь, потому, что петя не отпустил еще коммитом или ролбаком.
отпустит -- тут их вася и прочитает "для апдейту". и надругается разно.

Вопрос еще с пространством блокировки
если петя списывает товар А
а вася товар Б

то они не должны друг друга блокировать, SELECT FOR UPDATE справиться с этим?

справится при аккуратном применении (не лочить то что не надо).

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Блокировка записей от чтения
    #39241311
Maxim BogukТимошенко Александрпропущено...


Вопрос еще с пространством блокировки
если петя списывает товар А
а вася товар Б

то они не должны друг друга блокировать, SELECT FOR UPDATE справиться с этим?

справится при аккуратном применении (не лочить то что не надо).

--
Maxim Boguk
www.postgresql-consulting.ru

Ок, спасибо
...
Рейтинг: 0 / 0
Блокировка записей от чтения
    #39241315
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тимошенко Александр,

вас на 4 буквы послать ?

посылаю RTFM
оттуда сами можете все раскопать, например вот это ещё rtfm

и потихоньку, кирпичик за кирпичиком -- жызнь и наладиццо
...
Рейтинг: 0 / 0
Блокировка записей от чтения
    #39241488
qwwqТимошенко Александр,

вас на 4 буквы послать ?

посылаю RTFM
оттуда сами можете все раскопать, например вот это ещё rtfm

и потихоньку, кирпичик за кирпичиком -- жызнь и наладиццо

Ну раз уж послали, тогда ок, спасибо отзывается:)
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Блокировка записей от чтения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]