Что делать с блокировками?

W
Дата: 18.08.2004 11:47:37
Как бороться с блокировками? Не перегружать же постоянно сервер...
mwolf
Дата: 18.08.2004 12:48:49
Как бороться с блокировками
Не блокировать.
А если чесно, то не совсем понятно, что имеется ввиду.
W
Дата: 18.08.2004 13:14:38
Имеется ввиду вот что:
есть удаленный сервер,
на нем установлен pstgresql,
доступ к нему у меня есть только через phppgadmin,
на сервере интенсивно идет добавление информации и периодически возникают блокировки (висит куча процессов).

проблема пока решается путем дергания админа и перегрузки сервера.
Я думаю, что есть другие пути решения.
mwolf
Дата: 18.08.2004 13:57:09
То что возникают блокировки, это ещё не проблема. Проблема почему они не исчезают.
У меня на сервере в момент интесивных телодвижений программмеров висит до 40 процессов. Блокировок тоже уйма, но всё работает более или менее нормально. Проблема возникала при ошибках в программах, когда программер забывал подтверждать транзакцию. Тогда происходила блокировка какой-нить таблицы(страницы), и тогда остальные процессы замирали в ожидании.
Попробуй разобраться, почему транзакция не завершается.
Для решения проблемы ничего умнее
kill -9
не придумал. Либо по списку процессов
ps -ef|grep  postgres:
вычислял какой процесс блокировал, либо то же самое по блокировкам смортрел, запрос такой:
SELECT pg_class.relname AS relation,
    pg_database.datname AS "database",
    l."transaction",
    l."mode",
    l.granted as "grant",
    pg_stat_activity.datname,
    pg_stat_activity.procpid,
    pg_stat_activity.usename,
    pg_stat_activity.current_query --l.pid
FROM pg_lock_status() l(relation oid, "database" oid, "transaction" xid, pid
    integer, "mode" text, granted boolean)
    LEFT JOIN  pg_class
    ON (l.relation = pg_class.reltype)
    LEFT JOIN pg_database
    ON (l."database" = pg_database.oid)
    LEFT JOIN pg_stat_activity
    ON (l.pid = pg_stat_activity.procpid)
ORDER BY pg_database.datname, pg_stat_activity.datname;
Sad Spirit
Дата: 18.08.2004 14:18:30
W
на сервере интенсивно идет добавление информации и периодически возникают блокировки (висит куча процессов).


что заставляет думать, что это именно блокировки?

что в списке процессов (пусть админ посмотрит)?

не используется ли случайно pg_pconnect()?
W
Дата: 18.08.2004 15:14:26
Скорее всего, я действительно где-то делаю что-то не так, поэтому блокировки не исчезают. Блокировки я смотрел из вьюхи pg_locks и запросом, который выше. Количество процессов тоже можно увидеть в phppgadmin.
Разобраться самому пока не хватает опыта :(
Кратко по системе:
есть несколько сканеров написанных на пхп, они обрабатывают определенные веб -странички и записывают полученную информацию в базу. Запись производится с помощью одной процедуры. Сама процедура делает селекты, добавляет новые записи (реже обновляет старые), вызывает другую процедуру. Кроме этого, к полученным данным через сайт сделан доступ. Мне кажется, блокирови создает процедура добавления. Как ее можно модифицировать, чтобы этого не было? Может есть какие-нибудь ключевые слова?
W
Дата: 18.08.2004 15:17:25
Sad Spirit

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

не используется ли случайно pg_pconnect()?


Что именно посмотреть админу в списке процессов?
Используется не pg_pconnect(), а pg_connect() (функция php)
Sad Spirit
Дата: 18.08.2004 15:35:16
понятно... может действительно быть проблема, если транзакции при добавлении идут долго, и обновляется таблица, на которой есть внешние ключи.

рекомендуется внешние ключи создавать как DEFERRABLE INITIALLY DEFERRED
W
Дата: 18.08.2004 15:45:58
Sad Spirit
понятно... может действительно быть проблема, если транзакции при добавлении идут долго, и обновляется таблица, на которой есть внешние ключи.

рекомендуется внешние ключи создавать как DEFERRABLE INITIALLY DEFERRED


Ок, попробую.
Такой вопрос еще, а COMMIT в процедуре после операций вставки и обновления не поможет? Вообще, нужно ли явно управлять транзакциями в postgresql?