Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
10.02.2014, 12:48
|
|||
---|---|---|---|
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
Программным путем нужно определять кем заблокирована запись в таблице, и, в случае необходимости, разблокировать ее. Как это можно сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.02.2014, 16:41
|
|||
---|---|---|---|
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
Я как-то не правильно задал вопрос или проблема не решаема? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.02.2014, 16:43
|
|||
---|---|---|---|
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
На всякий случай - блокировка записи производится с помощью FOR UPDATE NOWAIT с клиентской части. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.02.2014, 17:11
|
|||
---|---|---|---|
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
else12, у postgres нет ограничения на количество заблокированных строк, это достигается благодаря тому что запись о блокировке строки хранится в самой строке. То есть чтобы получить информацию — кем заблокирована запись в таблице, нужно просмотреть все строки в таблице. Например если у Вас таблица 20 Гб — то что бы ответить на Ваш вопрос, нужно просматривать 20Гб каждый раз. Можно сделать по другому, убивать все сессии (pg_terminate_backend) с блокировкой RowShareLock на нужной таблице. PS: но вы явно делаете что-то не то. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.02.2014, 17:26
|
|||
---|---|---|---|
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
Ёшelse12, у postgres нет ограничения на количество заблокированных строк, это достигается благодаря тому что запись о блокировке строки хранится в самой строке. То есть чтобы получить информацию — кем заблокирована запись в таблице, нужно просмотреть все строки в таблице. Например если у Вас таблица 20 Гб — то что бы ответить на Ваш вопрос, нужно просматривать 20Гб каждый раз. Можно сделать по другому, убивать все сессии (pg_terminate_backend) с блокировкой RowShareLock на нужной таблице. PS: но вы явно делаете что-то не то. Да у меня задача простая: в случае, если два пользователя обращаются к одной записи таблицы, то первый может ее редактировать, а второй только смотреть. И периодически возникают вопросы: "А кто сейчас заблокировал запись?" Записей в таблице, естественно, много и пользователей хватает. Нужно оперативно узнавать кто держит запись, желательно даже, чтобы пользователь сам видел кто блокирует запись, к которой он хочет обратиться. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.02.2014, 17:52
|
|||
---|---|---|---|
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
9.26.8. Advisory Lock Functions Может стоит это использовать и отказаться от UPDATE NOWAIT. Пользователи всё смогут видеть, все смогут редактировать так как Вы захотите, и не будут висеть пока строка не освободится. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.02.2014, 17:57
|
|||
---|---|---|---|
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
Через NOTIFY можно самому признаваться, что редактируешь ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.02.2014, 18:22
|
|||
---|---|---|---|
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
Ёшelse12, у postgres нет ограничения на количество заблокированных строк, это достигается благодаря тому что запись о блокировке строки хранится в самой строке. То есть чтобы получить информацию — кем заблокирована запись в таблице, нужно просмотреть все строки в таблице. Например если у Вас таблица 20 Гб — то что бы ответить на Ваш вопрос, нужно просматривать 20Гб каждый раз. Можно сделать по другому, убивать все сессии (pg_terminate_backend) с блокировкой RowShareLock на нужной таблице. PS: но вы явно делаете что-то не то.оффтоп ЯННП , т.е. пользователь уже обрашается к конкретной строке - и именно она и заблокирована. на кой ему просматривать ещё 20ГБстрок, "чтобы блаблаблабла" ? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.02.2014, 18:26
|
|||
---|---|---|---|
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
SmeL_md 9.26.8. Advisory Lock Functions Может стоит это использовать и отказаться от UPDATE NOWAIT. Пользователи всё смогут видеть, все смогут редактировать так как Вы захотите, и не будут висеть пока строка не освободится.адвайзори лок не отдаст вам автора т.е. совсем к тому же если начать пользоваться АЛ на всех табличках, да в которых кеи -длинное целое - непонятно, как различать лонг в одной табле от лонга в другой. т.е. это какой-то такой полуфабрикат, которым можно пользоваться для демонстрации возможности, но нельзя (без хитрого саморезного винта) - в широкой практике. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.02.2014, 18:33
|
|||
---|---|---|---|
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
qwwq...если начать пользоваться АЛ на всех табличках, да в которых кеи -длинное целое - непонятно, как различать лонг в одной табле от лонга в другой... pg_advisory_lock(key1 int, key2 int) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.02.2014, 18:35
|
|||
---|---|---|---|
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
SmeL_mdqwwq...если начать пользоваться АЛ на всех табличках, да в которых кеи - длинное целое - непонятно, как различать лонг в одной табле от лонга в другой... pg_advisory_lock(key1 int , key2 int ) засуньте сюда 1 инт - tableoid + 1 лонг - pk я таки немного попрактиковал в этой области, ага т.ч. не надо тукать в меня домыслами ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.02.2014, 19:39
|
|||
---|---|---|---|
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
qwwqSmeL_mdпропущено... pg_advisory_lock(key1 int , key2 int ) засуньте сюда 1 инт - tableoid + 1 лонг - pk я таки немного попрактиковал в этой области, ага т.ч. не надо тукать в меня домыслами Чисто для непрактиковавших, можно попросить изложить быстро промелькнувшие за 2 минуты мысли письменно? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.02.2014, 20:25
|
|||
---|---|---|---|
|
|||
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
У вас, похоже, долгая бизнес транзакция. Типичный пример: кто-то делает checkout на документе, редактирует его 20 минут или час, а потом делает checkin обновленного документа с новым номером версии. Вешать ее на внутренний механизм транзакций в базе нехорошо. Обычно добавляют пару колонок checkedout timestamp, checkedoutby varchar(64). Первый пользователь в своей первой транзакции просто заполняет checkedout и checkedoutby, и выполняет коммит. После чего всем видно кто забрал документ, и когда. Разумеется, приложение не должно пытаться обновлять документ кусками, а только одной транзакцией при checkin. Опять же надо чистить статусы у документов, которые кто-то забрал, а потом уехал в отпуск, а другим тоже надо. Но это лучше, чем держать в базе открыту. транзакцию часами, а т и днями. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.02.2014, 20:26
|
|||
---|---|---|---|
|
|||
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
Hawkmoonqwwqпропущено... засуньте сюда 1 инт - tableoid + 1 лонг - pk я таки немного попрактиковал в этой области, ага т.ч. не надо тукать в меня домыслами Чисто для непрактиковавших, можно попросить изложить быстро промелькнувшие за 2 минуты мысли письменно?можно, мысль простая: в общем случае нам надо лочить объект, состоящий из ид таблицы, и ключа в ней. т.е. в идеале int4 + hstore (как вариант int + text[]. на худой - int + text) нам предлагают лочить или bigint (only) или пару чисел (int,int) уже для пары (int {tableoid},bigint {pkey}) этого недостаточно если не пририсовывать тяжело груженых велосипедов, осуществляющих мапинг теущего набора залоченных бигинтов (ну не ярды же записей одновременно "залочены") [или ключей иного состава] на мн-во интов. собственно выше всё это уже сказано. имеющий уши, но кто ж их моет, ага. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.02.2014, 21:19
|
|||
---|---|---|---|
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
qwwqт.е. пользователь уже обрашается к конкретной строке - и именно она и заблокирована. на кой ему просматривать ещё 20ГБстрок, "чтобы блаблаблабла" ?да, точно, можно не просматривать, но сейчас нет такого готового модуля, я смотрел http://www.postgresql.org/docs/9.2/static/pgrowlocks.html а он всю таблицу сканирует. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.10.2020, 14:56
|
|||
---|---|---|---|
|
|||
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
Всем добрый день! Аналогичный вопрос возник - возможно за прошедшие 6 (от начального поста) лет в постргресе таки появилась возможность узнать имя пользователя редактирующего строку в таблице? С использованием системных представлений? Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.10.2020, 21:39
|
|||
---|---|---|---|
|
|||
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
pg_stat_activity ? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.10.2020, 22:21
|
|||
---|---|---|---|
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.10.2020, 14:58
|
|||
---|---|---|---|
|
|||
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
vyegorov, О! Спасибо. Беглым взглядом пробежался - это же запрос, который покажет взаимные блокировки? Я наверно должен был уточнить - строка у меня лочится как select for update nowait. Соответственно если этот запрос вернёт ошибку, что запись уже заблокирована, то нужно "мягко" вытащить запросом кто именно ее держит. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.10.2020, 21:48
|
|||
---|---|---|---|
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
alex_by_guest, Этот запрос показывает блокировки в системе “со стороны”, он мониторинговый. Посмотреть кто держит нужную вам запись можно запросом к pg_locks. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
03.11.2020, 15:55
|
|||
---|---|---|---|
|
|||
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
vyegorov, Благодарю Вас за ответ! Я проверил данный запрос после блокировки записи из одной сессии. В этом случае он, к сожалению, не возвращает ни одной строки. Если, при открытой транзакции в первой сессии, выполнить select for update из другой сессии(перевести в состояние ожидания освобождения строки), то да - запрос работает и показывает текст запроса из второй сессии. Т.е. открытым остается вопрос - как в postgresql проверить/докопаться какой пользователь "держит" запись в конкретной таблице не создавая конкурирующую блокировку? Т.е. на примере выше - ситуация когда у нас только одна начальная сессия. Возможно ли это сделать через системные вьюхи? Или может есть инструменты наподобие именованных транзакций в Oracle? Или такое в postgresql невозможно в принципе? Буду рад любой помощи в этом вопросе... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
03.11.2020, 16:47
|
|||
---|---|---|---|
|
|||
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
alex_by_guest, >Т.е. открытым остается вопрос - как в postgresql проверить/докопаться какой пользователь "держит" запись в конкретной таблице не создавая конкурирующую блокировку? Не возможно в принципе. Если очень надо то в 2 коннекта решать... в одном set lock_timeout '5s'; select for update во второй если сразу не получилось for update взять - смотрим с кем он конфликтует (и выводим информацию). каких то особых проблем с реализацией этого подхода я не вижу... -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
|
03.11.2020, 20:25
|
|||
---|---|---|---|
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
alex_by_guest, Блокировки на уровне записей не отслеживаются в системных вьюхах, вы представляете какой там объем данных может быть потенциально в базе на 10TB? Поэтому блокировки показываются только тогда, когда кто-то начинает ждать. В целом — не понятно какую задачу вы решить пытаетесь?.. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
09.11.2020, 15:01
|
|||
---|---|---|---|
|
|||
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
vyegorov, Ну тут скорее не объем базы важен, а количество редактирующих строки пользователей. В общем в итоге таки решил задачу через ваш запрос по поиску блокировок. Сделал через pg_background. В рамках функции - создаем блокировку в новой сесии и выполняем запрос по поиску этой блокировки. После получения пользователя убиваем бэкграунд сессию. Еще раз спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
|
09.11.2020, 15:07
|
|||
---|---|---|---|
|
|||
Можно ли узнать какой пользователь заблокировал запись в таблице? |
|||
#18+
vyegorov, PS. А задача весьма распространённая. Например дать возможность одному сотруднику найти того, кто "держит" нужный ему документ. Например кладовщик забыл сохранить накладную и ушел на обед/перекур/загул. А диспетчер ее выдать водителю не может. Соответственно перед ним встает вопрос - кого из пользователей пинать, кому звонить чтобы отпустил документ? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=53&mobile=1&tid=1994357]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
159ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
74ms |
get tp. blocked users: |
2ms |
others: | 295ms |
total: | 576ms |
0 / 0 |