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

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

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

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

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

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
23.05.2016, 08:58
    #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
23.05.2016, 09:23
    #39241130
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка записей от чтения
Тимошенко Александр,

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

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

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

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

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

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

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

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


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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

--
Maxim Boguk
www.postgresql-consulting.ru

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

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

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

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

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

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

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

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


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