блог-форум о программировании

Вы не вошли.


Deprecated: Function create_function() is deprecated in /home/user2058794/www/majestio.info/include/class/geshi.php on line 4698

#1 2017-11-20 18:40:46

Majestio
Администратор
Здесь с 2017-11-17
Сообщений: 73
Windows 10Firefox 57.0

Обработка транзакций и блокировок (PostgreSQL)


Обработка транзакций и блокировок (PostgreSQL)


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

1) Делаем служебную таблицу public."Locks" следующего формата
CREATE TABLE public."Locks" (
  "Table" VARCHAR(128) NOT NULL,
  "Record" INTEGER NOT NULL,
  "User" INTEGER NOT NULL,
  "Pid" INTEGER NOT NULL,
  "Date" DATE NOT NULL,
  "Time" TIME(6) WITHOUT TIME ZONE NOT NULL,
  CONSTRAINT "Locks_idx" PRIMARY KEY("User", "Table", "Record")
) WITHOUT OIDS;

В нее будем записывать все блокировки. По полям это понятно:

  • Имя таблицы, в которой блокируем запись

  • Номер записи по ее полю Id

  • Ид-пользователя (его имя можно будет взять со служебной таблицы Users)

  • PID своего процесса на сервере - берется через pg_backend_pid()

  • дата-время блокировки

2) При логине клиента и начале работы - убиваем все свои старые транзакции

Для этого по полю User ищем все свои "старые" PID и убиваем их:

SELECT pg_terminate_backend(pid);
3) При попытке установки своей блокировки - ищем Таблицу-Номер_записи

Если временной штамп меньше заданного - ждем (делаем попытки захвата раз в N сек),
Если временной штамп больше заданного - пробуем убить чужую блокировку

4) Убиваем чужую блокировку

подключенные соединения отлавливаем запросом

SELECT procpid FROM pg_stat_activity

убиваем чужие блокировки, если их PID'ы отсутствуют в списке подключенных

Все описанное справедливо для PostgreSQL > 9.x версии и наличии прав суперпользователя у подключаемого клиента

Вне форума

Сейчас в этой теме пользователей: 0, гостей: 1
[Bot] CCBot

Подвал форума

Под управлением FluxBB
Модифицировал Visman

[ Сгенерировано за 0.069 сек, 7 запросов выполнено - Использовано памяти: 2.18 Мбайт (Пик: 2.71 Мбайт) ]