Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Можно сделать блокировку записи?
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat assaв свое время думал, что для версионника вместо апдейта (длинной записи) имеет смысл делать INSERT/DELETE в (короткозаписной) таблице флагов.не знаю. в постгресе чтение и запись идет постранично? если да, то получается все равно.т.е. иметь сотню - другую версий длинной записи - все равно, что иметь сотню-другую версий короткой? извините, не догоняю. проблема решения со внешней таблицей, насколько я помню свои рассуждения, была только на потерях на соединение таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2007, 11:54 |
|
||
|
Можно сделать блокировку записи?
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat postmanЗадача не очень сложная, есть данные фирм, их должны обрабатывать операторы. Жесткое условие одно, чтобы данные фирмы не могли одновременно быть у двух опреаторов, потому что оператор возможно будет совершать звонки в эти организации, чтоб не получилось дурацкой ситуации, когда в одну контору звонят двое или больше операторов.В момент открытия оператором карточки фирмы делается транзакция "update firms set caller_id=? where firm_id=? and caller_id is null", в момент закрытия - "update firms set caller_id=null where firm_id=? and caller_id=?". Спасибо! Похоже Ваше решение нмамного более праивльное чем мое, и действительно скорее всего мне не понадобятся блокировки! Век живи - век учись :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2007, 12:15 |
|
||
|
Можно сделать блокировку записи?
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat postmanЗадача не очень сложная, есть данные фирм, их должны обрабатывать операторы. Жесткое условие одно, чтобы данные фирмы не могли одновременно быть у двух опреаторов, потому что оператор возможно будет совершать звонки в эти организации, чтоб не получилось дурацкой ситуации, когда в одну контору звонят двое или больше операторов.В момент открытия оператором карточки фирмы делается транзакция "update firms set caller_id=? where firm_id=? and caller_id is null", в момент закрытия - "update firms set caller_id=null where firm_id=? and caller_id=?".Ээээ... В смысле, не завершая транзакцию? Т.е. фактически блокируя запись? Потому что, если это не так (т.е. просто апдейтим запись и завершаем транзакцию), то представляем себе ситуацию, когда клиентское приложение "карточка" по какой-то причине слетает и запись остается навечно отмечена как "используемая в этот момент". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2007, 12:29 |
|
||
|
Можно сделать блокировку записи?
|
|||
|---|---|---|---|
|
#18+
assaт.е. иметь сотню - другую версий длинной записи - все равно, что иметь сотню-другую версий короткой?"чтоб не получилось дурацкой ситуации, когда в одну контору звонят двое или больше операторов" - то есть речь не идет о сотне-другой операторов, которые звонят в одну контору. а две версии длинных строк, как и коротких, влезут на одну страницу. pamirЭэээ... В смысле, не завершая транзакцию? Т.е. фактически блокируя запись?Нет, я имел в виду транзакцию завершать. И только в случае успешного завершения этой транзакции давать оператору возможность просмотра (редактирования) карточки фирмы. pamirПотому что, если это не так (т.е. просто апдейтим запись и завершаем транзакцию), то представляем себе ситуацию, когда клиентское приложение "карточка" по какой-то причине слетает и запись остается навечно отмечена как "используемая в этот момент".Да, такой эффект видимо имеет место. Вроде бы с "advisory locks" такая же ситуация: "a lock acquired during a transaction that is later rolled back will still be held following the rollback, and likewise an unlock is effective even if the calling transaction fails later". Можно изменить запросы, запретив операторам работать над карточкой фирмы более 1 часа, таким образом: update firms set caller_id=?, caller_begtime=now() where firm_id=? and ( caller_id is null or caller_begtime < now() - '1 hour' ) update firms set caller_id=null, caller_begtime=null where firm_id=? and caller_id=? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2007, 13:00 |
|
||
|
Можно сделать блокировку записи?
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat pamirПотому что, если это не так (т.е. просто апдейтим запись и завершаем транзакцию), то представляем себе ситуацию, когда клиентское приложение "карточка" по какой-то причине слетает и запись остается навечно отмечена как "используемая в этот момент".Да, такой эффект видимо имеет место. Вроде бы с "advisory locks" такая же ситуация: "a lock acquired during a transaction that is later rolled back will still be held following the rollback, and likewise an unlock is effective even if the calling transaction fails later". Можно изменить запросы, запретив операторам работать над карточкой фирмы более 1 часа, таким образом: update firms set caller_id=?, caller_begtime=now() where firm_id=? and ( caller_id is null or caller_begtime < now() - '1 hour' ) update firms set caller_id=null, caller_begtime=null where firm_id=? and caller_id=? Можно так, вот мое предложение (сырое, не проверенное, возможны и даже нужны возражения). На чем пишется клиент? Если это веб, где нет постоянного коннекта к базе, тогда вариант не проходит. Если же клиент-сервер, где есть постоянный коннект к базе и клиент может им рулить, тогда просто при открытии карточки делаем предложенный апдейт (или просто select for update), но не завершаем транзакцию. После звонка надо нажать кнопку, которая завершит транзакцию и освободит строку (возможно заодно нужно будет и проапдейтить строку на предмет, что до них уже дозвонились). Если приложение слетает, то (как я думаю) в постгресе есть настройка как в оракле, которая указывает что и через какое время делать с неактивными сессиями. Обычно (я чаще сталкивался в оракле) настроено так, что через определенное время неактивности, сессия убивается, а транзакция откатывается. Таким образом, при слете приложения, через какое-то время строка освободится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2007, 13:50 |
|
||
|
Можно сделать блокировку записи?
|
|||
|---|---|---|---|
|
#18+
Пишу на java se+ jdbc. Операторов у меня не много сейчас не более 4 человек, и предложение LeXa NalBat мне кажется очень подходящим в моей ситуации. А потом попробую добавить то что предложил pamir для выявления незаконченных сессий. (Сейчас для меня важнее в срок успеть) Программирую недавно, опыта не много, в этом топике узнал новое :) спасибо всем кто отвечал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2007, 14:08 |
|
||
|
Можно сделать блокировку записи?
|
|||
|---|---|---|---|
|
#18+
postmanПишу на java se+ jdbc. Операторов у меня не много сейчас не более 4 человек, и предложение LeXa NalBat мне кажется очень подходящим в моей ситуации. А потом попробую добавить то что предложил pamir для выявления незаконченных сессий. (Сейчас для меня важнее в срок успеть) Программирую недавно, опыта не много, в этом топике узнал новое :) спасибо всем кто отвечал. В догонку добавлю - для такой связки следующее решение моего варианта Есть у тебя Код: plaintext Код: plaintext Потом когда пытаешься выполнить лок строки (или апдейт, что одно и тоже) ловишь Код: plaintext Ну, а завершаешь все либо Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2007, 14:17 |
|
||
|
Можно сделать блокировку записи?
|
|||
|---|---|---|---|
|
#18+
pamirЕсли же клиент-сервер, где есть постоянный коннект к базе ... или просто select for updateда, вроде бы select for update подходит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2007, 14:19 |
|
||
|
Можно сделать блокировку записи?
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat assaт.е. иметь сотню - другую версий длинной записи - все равно, что иметь сотню-другую версий короткой?"чтоб не получилось дурацкой ситуации, когда в одну контору звонят двое или больше операторов" - то есть речь не идет о сотне-другой операторов, которые звонят в одну контору. а две версии длинных строк, как и коротких, влезут на одну страницу.?Ы? кажется количестов версий зависит только от частоты их создания и частоты вакуума. если "по поводу" одной и той же записи звонят часто, а вакуум происходит редко - количество отработанных версий будет измеряться не то, чтобы сотнями, но может и тысячами. число 2 в этих суждениях нигде не возникает. (от количества одновременных "операторов, которые звонят" оно, кажется, никак не зависит). Я не прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2007, 14:22 |
|
||
|
Можно сделать блокировку записи?
|
|||
|---|---|---|---|
|
#18+
assaкажется количестов версий зависит только от частоты их создания и частоты вакуума. если "по поводу" одной и той же записи звонят часто, а вакуум происходит редко - количество отработанных версий будет измеряться не то, чтобы сотнями, но может и тысячами. число 2 в этих суждениях нигде не возникает. (от количества одновременных "операторов, которые звонят" оно, кажется, никак не зависит). Я не прав?Я фантазировал на тему "не замедлится ли апдейт для длинных строк по сравнению с короткими". Скорость апдейта наверное слабо зависит от кол-ва старых версий строк в файле. А не на тему "не увеличится ли файл таблицы", которая вряд ли может волновать нас сама по себе (hdd нынче недороги), но лишь опосредованно негативно влияя на скорость работы СУБД. PS: "Вакуум происходит редко". Конечно же вакуум надо запускать своевременно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2007, 14:45 |
|
||
|
Можно сделать блокировку записи?
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat Я фантазировал на тему "не замедлится ли апдейт для длинных строк по сравнению с короткими". Скорость апдейта наверное слабо зависит от кол-ва старых версий строк в файле.спасибо. это дельное замечание. (усложнение запросов и хранимок при добавке таблиц - пожалуй не слишком хорошая плата за решение ,не влияющее на скорость). с другой стороны, если учесть, что в индексы (до вакуума или реиндекса) входят и указатели на все старые версии записи, то и поиск и апдейт таки замедлятся. Я опять что-то не то думаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2007, 15:38 |
|
||
|
Можно сделать блокировку записи?
|
|||
|---|---|---|---|
|
#18+
assaс другой стороны, если учесть, что в индексы (до вакуума или реиндекса) входят и указатели на все старые версии записи, то и поиск и апдейт таки замедлятсяможет быть и замедлятся. но размер и кол-во индексных указателей и скорость работы с ними не зависит от того, указывают они на длинные строки, или на короткие. то есть "скорость апдейта для длинных строк по сравнению с короткими" от индексов и старых версий записей в них, видимо, не зависит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2007, 16:05 |
|
||
|
Можно сделать блокировку записи?
|
|||
|---|---|---|---|
|
#18+
резонно. (хотя надо повнимательнее на всю кухню посмотреть) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2007, 16:07 |
|
||
|
Можно сделать блокировку записи?
|
|||
|---|---|---|---|
|
#18+
assa Nick Gazaloffпоявилось начиная с 8.2. не подскажете - ф-ии в ей сишные? Не понял. Функции вызываются, как любые другие: Код: plaintext судя по идеологии их можно реализовать хоть на plpgsql (+ доп таблички). Однако - наверное это медленнее, чем класть признаки прям в память. А скачивать 8.2 на предмет посмотреть содержимое pg_proc - мне как-то... да, лениво. Вот и спросил вас. Извините, если что.[/quot] Реализованы они на C, и работают с менеджером блокировок Postgres. То есть, это тоже локи, которые видно в pg_locks. Только смысл их приложение определяет само, и, так как они advisory, то блокируют они только тех, кто их "уважает" (то есть, все клиенты должны обращаться к ним). Поскольку ими управляет менеджер блокировок Postgres, то они очень быстрые и автоматичиски освобождаются при закрытии сеанса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2007, 19:52 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=34781943&tid=2005052]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 252ms |
| total: | 391ms |

| 0 / 0 |
