|
|
|
Блокировка записей от чтения
|
|||
|---|---|---|---|
|
#18+
В PostgreSQL реализована модель когда читающие транзакции не блокируют пишущие. Как организовать в таком случае блокировку от чтения определенного набора строк в таблице, на то время пока другая транзакция их прочитала и пишет в таблицу? Или я просто не совсем понял смысл работы "версионного механизма". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2016, 22:40 |
|
||
|
Блокировка записей от чтения
|
|||
|---|---|---|---|
|
#18+
Тимошенко Александр, А что конкретно вы делаете, можете привести пример? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2016, 23:26 |
|
||
|
Блокировка записей от чтения
|
|||
|---|---|---|---|
|
#18+
Тимошенко АлександрВ PostgreSQL реализована модель когда читающие транзакции не блокируют пишущие. Как организовать в таком случае блокировку от чтения определенного набора строк в таблице, на то время пока другая транзакция их прочитала и пишет в таблицу? Или я просто не совсем понял смысл работы "версионного механизма". Не совсем понято что значит блокировка от чтения и главное зачем она вам нужна. Объясните что вы хотите сделать на примере. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 04:15 |
|
||
|
Блокировка записей от чтения
|
|||
|---|---|---|---|
|
#18+
Для примера система складского партионного учета, надо выбрать данные о остатках, потом сформировать записи "расхода", проставив в них партии по фифо из остатков, потом записать их. Другие транзакции таблицу(не всю конечно, а по данному складу и данной номенклатуре) пока все это происходить читать не должны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 08:45 |
|
||
|
Блокировка записей от чтения
|
|||
|---|---|---|---|
|
#18+
Тимошенко АлександрДля примера система складского партионного учета, надо выбрать данные о остатках, потом сформировать записи "расхода", проставив в них партии по фифо из остатков, потом записать их. Другие транзакции таблицу(не всю конечно, а по данному складу и данной номенклатуре) пока все это происходить читать не должны. Хоть убейте не понял почему "Другие транзакции таблицу(не всю конечно, а по данному складу и данной номенклатуре) пока все это происходить читать не должны"? Пока вы транзакцию не commit никто этих изменений не увидит ни при каких условиях. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 08:49 |
|
||
|
Блокировка записей от чтения
|
|||
|---|---|---|---|
|
#18+
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 записывает в таблицу расход, и меняет остатки В итоге у нас минус по первой партии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 08:58 |
|
||
|
Блокировка записей от чтения
|
|||
|---|---|---|---|
|
#18+
Тимошенко Александр, А почему вы думаете, что "меняет остатки" должно что-то изменить в таблице, а "списывает" не должно? Если вы сделаете всё в рамках транзакций, то у вас возникнет конфликт писателей, и всё будет правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 09:23 |
|
||
|
Блокировка записей от чтения
|
|||
|---|---|---|---|
|
#18+
vyegorovТимошенко Александр, А почему вы думаете, что "меняет остатки" должно что-то изменить в таблице, а "списывает" не должно? Если вы сделаете всё в рамках транзакций, то у вас возникнет конфликт писателей, и всё будет правильно. Немного не точно выразился, запись в таблицу(списание), это и есть "меняет остатки" Грубо говоря будет так тр1 SELECT тр2 SELECT тр2 тр2 SELECT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 09:31 |
|
||
|
Блокировка записей от чтения
|
|||
|---|---|---|---|
|
#18+
Тимошенко АлександрvyegorovТимошенко Александр, А почему вы думаете, что "меняет остатки" должно что-то изменить в таблице, а "списывает" не должно? Если вы сделаете всё в рамках транзакций, то у вас возникнет конфликт писателей, и всё будет правильно. Немного не точно выразился, запись в таблицу(списание), это и есть "меняет остатки" Грубо говоря будет так тр1 SELECT тр2 SELECT тр2 тр2 SELECT Грубо говоря будет так тр1 SELECT тр2 SELECT тр2 INSERT тр2 INSERT Проблема в том что первые два селекта считают одинаковые состояния таблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 09:33 |
|
||
|
Блокировка записей от чтения
|
|||
|---|---|---|---|
|
#18+
Записываете транзакцией. В момент записи делаете проверку. Если не хватает, откатываете все назад, обновляете данные клиенту и говорите ему: "Ты не успел, Вася. Петя был шустрее." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 10:16 |
|
||
|
Блокировка записей от чтения
|
|||
|---|---|---|---|
|
#18+
Тимошенко АлександрДля примера система складского партионного учета, надо выбрать данные о остатках, потом сформировать записи "расхода", проставив в них партии по фифо из остатков, потом записать их. Другие транзакции таблицу(не всю конечно, а по данному складу и данной номенклатуре) пока все это происходить читать не должны.рассуждение про сферические транзакции в вакууме. на сферически организованной структуре. любителям сферических блокировок есть transaction isolation lavel serializable (надеюсь не описался -- не держу в памяти за ненадобностью). для разведения проблемы при рид коммитеде -- делаете изменение остатков инкрементально, наваривая только что тут же (в том же стейтменте) прочитанный остаток. второй пришедший к записи встанет на неё в очередь. и запишет свой инкремент только на закомиченное значение. если же логика сложна и развесиста -- т.е .читаете вы в одном месте, потом долго считаете, потом навариваете, уже сильно забыв, что читали -- то есть select for update -- для организации очереди потенциальных писателей в момент первого прочтения. и unique -- для организации очереди на insert. ...и т.п. и т.д. например т.к. insert no wait нет -- там, при необходимости делается адвайзори лок.... т.е. мыслите в терминах подхода к снаряду. разделяемому сиречь ресурсу -- и всё наладится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 10:33 |
|
||
|
Блокировка записей от чтения
|
|||
|---|---|---|---|
|
#18+
Тимошенко АлександрВ PostgreSQL реализована модель когда читающие транзакции не блокируют пишущие. Как организовать в таком случае блокировку от чтения определенного набора строк в таблице, на то время пока другая транзакция их прочитала и пишет в таблицу? Или я просто не совсем понял смысл работы "версионного механизма". удалить на время ненужные для просмотра записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 11:07 |
|
||
|
Блокировка записей от чтения
|
|||
|---|---|---|---|
|
#18+
еще можно сделать флаг возможности просмотра, и по нему фильтровать. при изменении записей делать это в три транзакции: сначала убрать флаг возможности просмотра, потом сделать нужные действия, потом поставить флаг обратно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 11:10 |
|
||
|
Блокировка записей от чтения
|
|||
|---|---|---|---|
|
#18+
IgorNKЗаписываете транзакцией. В момент записи делаете проверку. Если не хватает, откатываете все назад, обновляете данные клиенту и говорите ему: "Ты не успел, Вася. Петя был шустрее." Да, партия 1 уже списана, и тогда вася спросит, ведь есть же еще партия 2 и при чем тут петя? Партии то подбирает алгоритм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 11:59 |
|
||
|
Блокировка записей от чтения
|
|||
|---|---|---|---|
|
#18+
MasterZivеще можно сделать флаг возможности просмотра, и по нему фильтровать. при изменении записей делать это в три транзакции: сначала убрать флаг возможности просмотра, потом сделать нужные действия, потом поставить флаг обратно.ыыыы логический лок называется. но одного флага для него мало. нужно ещё метку времени. и автора захвата (гуид, скажем) и либо джоб по очистке протухших флагов, либо договоренность о считании протухших -- недействительными (со всеми прелестями в виде сдвига сервреного времени одмином. внезапно). поскольку сделал он 1. и вышел из сеанса снятием приложения. И вот оно навечно замуровано. и да, -- с обязательной проверкой на 2-м этапе актуальности "логической блокировки" в момент записи (именно за этим сеансом -- гуидом), а не только в момент чтения. (а то прочитают, и пойдут обедать а там и баиньки, лок записи протухнет, кто--то её опять захватит и запишет своё, ну и т.д., а тут старичок вернётся -- и закоммитит давно не актуальный расчёт) и да -- флаги с причиндалами сделать отдельной таблицей, и её вакуумировать и даже full вакуумировать нещадно. ибо движок ей надобен бы блокировочный, безверсионый, ан его и нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 12:01 |
|
||
|
Блокировка записей от чтения
|
|||
|---|---|---|---|
|
#18+
qwwqТимошенко АлександрДля примера система складского партионного учета, надо выбрать данные о остатках, потом сформировать записи "расхода", проставив в них партии по фифо из остатков, потом записать их. Другие транзакции таблицу(не всю конечно, а по данному складу и данной номенклатуре) пока все это происходить читать не должны.рассуждение про сферические транзакции в вакууме. на сферически организованной структуре. любителям сферических блокировок есть transaction isolation lavel serializable (надеюсь не описался -- не держу в памяти за ненадобностью). для разведения проблемы при рид коммитеде -- делаете изменение остатков инкрементально, наваривая только что тут же (в том же стейтменте) прочитанный остаток. второй пришедший к записи встанет на неё в очередь. и запишет свой инкремент только на закомиченное значение. если же логика сложна и развесиста -- т.е .читаете вы в одном месте, потом долго считаете, потом навариваете, уже сильно забыв, что читали -- то есть select for update -- для организации очереди потенциальных писателей в момент первого прочтения. и unique -- для организации очереди на insert. ...и т.п. и т.д. например т.к. insert no wait нет -- там, при необходимости делается адвайзори лок.... т.е. мыслите в терминах подхода к снаряду. разделяемому сиречь ресурсу -- и всё наладится. select for update наверное то что надо. Но вопрос в пространств которое он заблокирует, всю таблицу или только записи попавшие в выборку? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 12:02 |
|
||
|
Блокировка записей от чтения
|
|||
|---|---|---|---|
|
#18+
Тимошенко АлександрIgorNKЗаписываете транзакцией. В момент записи делаете проверку. Если не хватает, откатываете все назад, обновляете данные клиенту и говорите ему: "Ты не успел, Вася. Петя был шустрее." Да, партия 1 уже списана, и тогда вася спросит, ведь есть же еще партия 2 и при чем тут петя? Партии то подбирает алгоритм.ну вот, вы сами определились -- нужна очередь в подходах к фифу. т.е. записям партионного учета. вот и говорите "селект форе апдейт" в момент подхода к ним и пети и васи. пришел вася -- встал в очередь, потому, что петя не отпустил еще коммитом или ролбаком. отпустит -- тут их вася и прочитает "для апдейту". и надругается разно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 12:07 |
|
||
|
Блокировка записей от чтения
|
|||
|---|---|---|---|
|
#18+
qwwqТимошенко Александрпропущено... Да, партия 1 уже списана, и тогда вася спросит, ведь есть же еще партия 2 и при чем тут петя? Партии то подбирает алгоритм.ну вот, вы сами определились -- нужна очередь в подходах к фифу. т.е. записям партионного учета. вот и говорите "селект форе апдейт" в момент подхода к ним и пети и васи. пришел вася -- встал в очередь, потому, что петя не отпустил еще коммитом или ролбаком. отпустит -- тут их вася и прочитает "для апдейту". и надругается разно. Вопрос еще с пространством блокировки если петя списывает товар А а вася товар Б то они не должны друг друга блокировать, SELECT FOR UPDATE справиться с этим? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 12:09 |
|
||
|
Блокировка записей от чтения
|
|||
|---|---|---|---|
|
#18+
Тимошенко Александрqwwqпропущено... ну вот, вы сами определились -- нужна очередь в подходах к фифу. т.е. записям партионного учета. вот и говорите "селект форе апдейт" в момент подхода к ним и пети и васи. пришел вася -- встал в очередь, потому, что петя не отпустил еще коммитом или ролбаком. отпустит -- тут их вася и прочитает "для апдейту". и надругается разно. Вопрос еще с пространством блокировки если петя списывает товар А а вася товар Б то они не должны друг друга блокировать, SELECT FOR UPDATE справиться с этим? справится при аккуратном применении (не лочить то что не надо). -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 12:11 |
|
||
|
Блокировка записей от чтения
|
|||
|---|---|---|---|
|
#18+
Maxim BogukТимошенко Александрпропущено... Вопрос еще с пространством блокировки если петя списывает товар А а вася товар Б то они не должны друг друга блокировать, SELECT FOR UPDATE справиться с этим? справится при аккуратном применении (не лочить то что не надо). -- Maxim Boguk www.postgresql-consulting.ru Ок, спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 12:13 |
|
||
|
Блокировка записей от чтения
|
|||
|---|---|---|---|
|
#18+
Тимошенко Александр, вас на 4 буквы послать ? посылаю RTFM оттуда сами можете все раскопать, например вот это ещё rtfm и потихоньку, кирпичик за кирпичиком -- жызнь и наладиццо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 12:16 |
|
||
|
Блокировка записей от чтения
|
|||
|---|---|---|---|
|
#18+
qwwqТимошенко Александр, вас на 4 буквы послать ? посылаю RTFM оттуда сами можете все раскопать, например вот это ещё rtfm и потихоньку, кирпичик за кирпичиком -- жызнь и наладиццо Ну раз уж послали, тогда ок, спасибо отзывается:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2016, 15:41 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39241307&tid=1997225]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
225ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
73ms |
get tp. blocked users: |
1ms |
| others: | 272ms |
| total: | 621ms |

| 0 / 0 |
