powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Можно ли узнать какой пользователь заблокировал запись в таблице?
25 сообщений из 35, страница 1 из 2
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #38555526
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программным путем нужно определять кем заблокирована запись в таблице, и, в случае необходимости, разблокировать ее. Как это можно сделать?
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #38555980
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я как-то не правильно задал вопрос или проблема не решаема?
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #38555986
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На всякий случай - блокировка записи производится с помощью FOR UPDATE NOWAIT с клиентской части.
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #38556040
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else12, у postgres нет ограничения на количество заблокированных строк, это достигается благодаря тому что запись о блокировке строки хранится в самой строке. То есть чтобы получить информацию — кем заблокирована запись в таблице, нужно просмотреть все строки в таблице. Например если у Вас таблица 20 Гб — то что бы ответить на Ваш вопрос, нужно просматривать 20Гб каждый раз.

Можно сделать по другому, убивать все сессии (pg_terminate_backend) с блокировкой RowShareLock на нужной таблице.

PS: но вы явно делаете что-то не то.
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #38556072
else12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёшelse12, у postgres нет ограничения на количество заблокированных строк, это достигается благодаря тому что запись о блокировке строки хранится в самой строке. То есть чтобы получить информацию — кем заблокирована запись в таблице, нужно просмотреть все строки в таблице. Например если у Вас таблица 20 Гб — то что бы ответить на Ваш вопрос, нужно просматривать 20Гб каждый раз.

Можно сделать по другому, убивать все сессии (pg_terminate_backend) с блокировкой RowShareLock на нужной таблице.

PS: но вы явно делаете что-то не то.
Да у меня задача простая: в случае, если два пользователя обращаются к одной записи таблицы, то первый может ее редактировать, а второй только смотреть. И периодически возникают вопросы: "А кто сейчас заблокировал запись?" Записей в таблице, естественно, много и пользователей хватает. Нужно оперативно узнавать кто держит запись, желательно даже, чтобы пользователь сам видел кто блокирует запись, к которой он хочет обратиться.
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #38556116
Фотография SmeL_md
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
9.26.8. Advisory Lock Functions
Может стоит это использовать и отказаться от UPDATE NOWAIT. Пользователи всё смогут видеть, все смогут редактировать так как Вы захотите, и не будут висеть пока строка не освободится.
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #38556124
Фотография SmeL_md
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Через NOTIFY можно самому признаваться, что редактируешь
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #38556153
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёшelse12, у postgres нет ограничения на количество заблокированных строк, это достигается благодаря тому что запись о блокировке строки хранится в самой строке. То есть чтобы получить информацию — кем заблокирована запись в таблице, нужно просмотреть все строки в таблице. Например если у Вас таблица 20 Гб — то что бы ответить на Ваш вопрос, нужно просматривать 20Гб каждый раз.

Можно сделать по другому, убивать все сессии (pg_terminate_backend) с блокировкой RowShareLock на нужной таблице.

PS: но вы явно делаете что-то не то.оффтоп

ЯННП
, т.е. пользователь уже обрашается к конкретной строке - и именно она и заблокирована. на кой ему просматривать ещё 20ГБстрок, "чтобы блаблаблабла" ?
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #38556155
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SmeL_md 9.26.8. Advisory Lock Functions
Может стоит это использовать и отказаться от UPDATE NOWAIT. Пользователи всё смогут видеть, все смогут редактировать так как Вы захотите, и не будут висеть пока строка не освободится.адвайзори лок не отдаст вам автора
т.е. совсем

к тому же если начать пользоваться АЛ на всех табличках, да в которых кеи -длинное целое - непонятно, как различать лонг в одной табле от лонга в другой. т.е. это какой-то такой полуфабрикат, которым можно пользоваться для демонстрации возможности, но нельзя (без хитрого саморезного винта) - в широкой практике.
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #38556164
Фотография SmeL_md
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq...если начать пользоваться АЛ на всех табличках, да в которых кеи -длинное целое - непонятно, как различать лонг в одной табле от лонга в другой...
pg_advisory_lock(key1 int, key2 int)
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #38556166
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SmeL_mdqwwq...если начать пользоваться АЛ на всех табличках, да в которых кеи - длинное целое - непонятно, как различать лонг в одной табле от лонга в другой...
pg_advisory_lock(key1 int , key2 int )
засуньте сюда 1 инт - tableoid + 1 лонг - pk

я таки немного попрактиковал в этой области, ага
т.ч. не надо тукать в меня домыслами
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #38556236
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqSmeL_mdпропущено...

pg_advisory_lock(key1 int , key2 int )
засуньте сюда 1 инт - tableoid + 1 лонг - pk

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

Чисто для непрактиковавших, можно попросить изложить быстро промелькнувшие за 2 минуты мысли письменно?
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #38556285
Sergei.Agalakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас, похоже, долгая бизнес транзакция. Типичный пример: кто-то делает checkout на документе, редактирует его 20 минут или час, а потом делает checkin обновленного документа с новым номером версии. Вешать ее на внутренний механизм транзакций в базе нехорошо. Обычно добавляют пару колонок checkedout timestamp, checkedoutby varchar(64). Первый пользователь в своей первой транзакции просто заполняет checkedout и checkedoutby, и выполняет коммит. После чего всем видно кто забрал документ, и когда.
Разумеется, приложение не должно пытаться обновлять документ кусками, а только одной транзакцией при checkin. Опять же надо чистить статусы у документов, которые кто-то забрал, а потом уехал в отпуск, а другим тоже надо. Но это лучше, чем держать в базе открыту. транзакцию часами, а т и днями.
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #38556287
йццй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hawkmoonqwwqпропущено...

засуньте сюда 1 инт - tableoid + 1 лонг - pk

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

Чисто для непрактиковавших, можно попросить изложить быстро промелькнувшие за 2 минуты мысли письменно?можно,

мысль простая:
в общем случае нам надо лочить объект, состоящий из ид таблицы, и ключа в ней. т.е. в идеале int4 + hstore (как вариант int + text[]. на худой - int + text)
нам предлагают лочить или bigint (only) или пару чисел (int,int)
уже для пары (int {tableoid},bigint {pkey}) этого недостаточно
если не пририсовывать тяжело груженых велосипедов, осуществляющих мапинг теущего набора залоченных бигинтов (ну не ярды же записей одновременно "залочены") [или ключей иного состава] на мн-во интов.

собственно выше всё это уже сказано. имеющий уши, но кто ж их моет, ага.
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #38556318
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqт.е. пользователь уже обрашается к конкретной строке - и именно она и заблокирована. на кой ему просматривать ещё 20ГБстрок, "чтобы блаблаблабла" ?да, точно, можно не просматривать, но сейчас нет такого готового модуля, я смотрел http://www.postgresql.org/docs/9.2/static/pgrowlocks.html а он всю таблицу сканирует.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #40013459
alex_by_guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем добрый день!
Аналогичный вопрос возник - возможно за прошедшие 6 (от начального поста) лет в постргресе таки появилась возможность узнать имя пользователя редактирующего строку в таблице? С использованием системных представлений?

Спасибо!
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #40013596
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pg_stat_activity ?
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #40013604
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #40013711
alex_by_guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov,
О! Спасибо.
Беглым взглядом пробежался - это же запрос, который покажет взаимные блокировки?
Я наверно должен был уточнить - строка у меня лочится как select for update nowait.
Соответственно если этот запрос вернёт ошибку, что запись уже заблокирована, то нужно "мягко" вытащить запросом кто именно ее держит.
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #40013802
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_by_guest,

Этот запрос показывает блокировки в системе “со стороны”, он мониторинговый.
Посмотреть кто держит нужную вам запись можно запросом к pg_locks.
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #40014897
alex_by_guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov,
Благодарю Вас за ответ!
Я проверил данный запрос после блокировки записи из одной сессии.
В этом случае он, к сожалению, не возвращает ни одной строки.
Если, при открытой транзакции в первой сессии, выполнить select for update из другой сессии(перевести в состояние ожидания освобождения строки), то да - запрос работает и показывает текст запроса из второй сессии.

Т.е. открытым остается вопрос - как в postgresql проверить/докопаться какой пользователь "держит" запись в конкретной таблице не создавая конкурирующую блокировку? Т.е. на примере выше - ситуация когда у нас только одна начальная сессия.

Возможно ли это сделать через системные вьюхи?
Или может есть инструменты наподобие именованных транзакций в Oracle?

Или такое в postgresql невозможно в принципе?
Буду рад любой помощи в этом вопросе...
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #40014927
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_by_guest,

>Т.е. открытым остается вопрос - как в postgresql проверить/докопаться какой пользователь "держит" запись в конкретной таблице не создавая конкурирующую блокировку?

Не возможно в принципе.


Если очень надо то в 2 коннекта решать...
в одном set lock_timeout '5s'; select for update
во второй если сразу не получилось for update взять - смотрим с кем он конфликтует (и выводим информацию).
каких то особых проблем с реализацией этого подхода я не вижу...


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #40015044
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_by_guest,

Блокировки на уровне записей не отслеживаются в системных вьюхах, вы представляете какой там объем данных может быть потенциально в базе на 10TB?
Поэтому блокировки показываются только тогда, когда кто-то начинает ждать.

В целом — не понятно какую задачу вы решить пытаетесь?..
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #40016524
alex_by_guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov,

Ну тут скорее не объем базы важен, а количество редактирующих строки пользователей.
В общем в итоге таки решил задачу через ваш запрос по поиску блокировок. Сделал через pg_background. В рамках функции - создаем блокировку в новой сесии и выполняем запрос по поиску этой блокировки. После получения пользователя убиваем бэкграунд сессию.

Еще раз спасибо!
...
Рейтинг: 0 / 0
Можно ли узнать какой пользователь заблокировал запись в таблице?
    #40016526
alex_by_guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov,

PS. А задача весьма распространённая. Например дать возможность одному сотруднику найти того, кто "держит" нужный ему документ. Например кладовщик забыл сохранить накладную и ушел на обед/перекур/загул. А диспетчер ее выдать водителю не может. Соответственно перед ним встает вопрос - кого из пользователей пинать, кому звонить чтобы отпустил документ?
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Можно ли узнать какой пользователь заблокировал запись в таблице?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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