powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Причины deadlock
13 сообщений из 13, страница 1 из 1
Причины deadlock
    #39204439
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Два независимых параллельных процесса вставляют данные в партицированные таблицы, которые создаются раз в сутки триггером на вставку. Триггерная функция одна общая. В триггере создается таблица пронаследованная от базовой, для этой таблицы создаются индексы и внешние ключи, раздаются права.
При этом возникает ошибка:
Код: sql
1.
2.
3.
4.
2016-03-30 16:50:16 MSK 6212 6969967ERROR:  deadlock detected
2016-03-30 16:50:16 MSK 6212 6969967DETAIL:
        Process 6212 waits for ShareUpdateExclusiveLock on relation 12530961 of database 10065830; blocked by process 8476.
	Process 8476 waits for AccessExclusiveLock on relation 10067977 of database 10065830; blocked by process 6212.



Прочитал тему .
Что-нибудь изменилось? Есть ли еще какие-нибудь советы.
Кстати на хабре предлагается способ создания партиций через триггер.
Спасибо.
...
Рейтинг: 0 / 0
Причины deadlock
    #39204462
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trot,

текст триггера приведите.

я создаю и обвязываю таблицу триггерно, но в автономии, одним полистейтментом. все остальные [автономии] встают в очередь, и обрабатывают ошибку "объект уже есть" или подобные. (при попытке выполнить тот же полистейтмент)

проблем нет.

единственный раз налетел на проблему, унаследовавшись от наполненного предка. пока он вакуумился-- висели все в очереди. (без дедлока). => не пустые предки -- зло для триггерного ддл
...
Рейтинг: 0 / 0
Причины deadlock
    #39204482
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
DECLARE

    m_tablename TEXT;
    m_startdate TEXT;
    m_enddate TEXT;

BEGIN
  	m_startdate := to_char ( CURRENT_DATE, 'YYYY_MM_DD' );
  	m_tablename := substring ( TG_TABLE_NAME from 6 ) || '_' || m_startdate;
 
    PERFORM 1
        FROM   pg_catalog.pg_class c
        JOIN   pg_catalog.pg_namespace n ON n.oid = c.relnamespace AND n.nspname = 'oi'
        WHERE  c.relkind = 'r'
        AND    c.relname = m_tablename;
 
  	IF NOT FOUND THEN
          m_enddate := m_startdate::TIMESTAMP WITH TIME ZONE + INTERVAL '1 day';
          BEGIN 
              EXECUTE 'CREATE UNLOGGED TABLE oi.' || m_tablename || ' (
                  CHECK (( date_save_db_begin >= ' || quote_literal ( m_startdate ) || '::TIMESTAMP WITH TIME ZONE)
                     AND ( date_save_db_begin < ' || quote_literal ( m_enddate ) || '::TIMESTAMP WITH TIME ZONE))
                ) INHERITS (oi.' || TG_TABLE_NAME || ');';

              EXECUTE 'ALTER TABLE oi.' || m_tablename || ' OWNER TO "spoarchive";
              			GRANT SELECT, INSERT ON TABLE oi.' || m_tablename || ' TO "users";';

              
                CASE 

                    WHEN substring ( TG_TABLE_NAME from 'crm' ) = 'crm' THEN
                    	EXECUTE ' CREATE INDEX ' || m_tablename || '_idx ON oi.' || m_tablename || ' USING btree (id);
                                ALTER TABLE oi.' || m_tablename || ' ADD CONSTRAINT ' || m_tablename || '_pkey PRIMARY KEY(id);
                                ALTER TABLE oi.' || m_tablename || ' ADD CONSTRAINT ' || m_tablename || '_fkey 
                            FOREIGN KEY (id) REFERENCES cls(id)
                                ON DELETE NO ACTION
                                ON UPDATE NO ACTION
                                NOT DEFERRABLE';

                    ELSE
                        NULL;
                END CASE;
            EXCEPTION
                WHEN duplicate_table THEN
                	NULL;
            END;
	END IF;
 
	EXECUTE 'INSERT INTO oi.' || m_tablename || ' VALUES ($1.*)' USING NEW;

	
	RETURN NULL;
END;
...
Рейтинг: 0 / 0
Причины deadlock
    #39204494
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trot,

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


по проблеме:
само создание по вашей технологии, будь вызвано из простых транзакций, вызовет только очереди, но не дедлоки. [навскидку]

ищите, где вы вперекрёст посягаете на лок ранее полоченного ресурса-- и вам воздастся.
...
Рейтинг: 0 / 0
Причины deadlock
    #39204497
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

шапка

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE OR REPLACE FUNCTION oi.tr (
)
RETURNS trigger AS
$body$
***
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY DEFINER
COST 100;
...
Рейтинг: 0 / 0
Причины deadlock
    #39204813
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trot,

Код: sql
1.
SELECT 12530961::regclass, 10067977::regclass



есть подозрение на fk.

и можете ли вы с двух рук одновременно создавать 2 разные партийции ?


ps ещё раз настоятельно рекомендую всё ddl вынести в автономии. это конечно налагает [и связывает], но идеологически единственно верно. если уж так хочется именно триггерно
...
Рейтинг: 0 / 0
Причины deadlock
    #39204894
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

Действительно два разных процесса пытаются одновременно (так совпало) создать одну и туже партицию.

Склоняюсь к идее создавать партиции по крону заранее (например, за час), до того как туда начнут записываться данные.

Настораживает ситуация, когда крон не отработает по каким-либо причинам, то процессы не смогут вставлять данные в требуемые партиции.
...
Рейтинг: 0 / 0
Причины deadlock
    #39204917
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trot,

для поденных партиций запускать раз в сутки, проверять наличие и добавлять на неделю вперед.
в триггере на вставку в мастер-таблицу обрабатывать исключение несуществования нужной партиции.
...
Рейтинг: 0 / 0
Причины deadlock
    #39204927
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trotqwwq,

Действительно два разных процесса пытаются одновременно (так совпало) создать одну и туже партицию.
нет. если "одну и ту же" -- они должны встать в очередь.
и второй процесс вылезет на блок обработки исключения.

//*если UNLOGGED TABLE не привносит особостей

т.е. вы так и не привели regclass -ов. они оба -- так и не создались, или один из них -- тот мастер, на который ФК смотрит ?

big-trotСклоняюсь к идее создавать партиции по крону заранее (например, за час), до того как туда начнут записываться данные.

Настораживает ситуация, когда крон не отработает по каким-либо причинам, то процессы не смогут вставлять данные в требуемые партиции.вы можете крон запускать раз в минуту, с обработкой ошибок. за 60*24 он уж точно что--то создаст. и оставить ветку создания в триггере.


ещё раз -- человек, создающий таблицу в контексте вызвавшей dml транзакции -- ССЗБ. все они, и на хабре, и в портмане, и вообще. Вынесите создание в автономию. Или напишите стороннего воркера (одного на всех) и все создания делайте как вызов этого воркера. (с очередью хотя бы по (parent|childe)--ам).
2--е сложнее -- надо каким--нито языком владеть, кроме sql / plpgsql. и как правило -- платформозависимо.
...
Рейтинг: 0 / 0
Причины deadlock
    #39204955
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwqт.е. вы так и не привели regclass -ов. они оба -- так и не создались, или один из них -- тот мастер, на который ФК смотрит ?

oi.base_crm_t2 (12530961)
cls (10067977)
...
Рейтинг: 0 / 0
Причины deadlock
    #39204981
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trotqwwqт.е. вы так и не привели regclass -ов. они оба -- так и не создались, или один из них -- тот мастер, на который ФК смотрит ?

oi.base_crm_t2 (12530961)
cls (10067977)вот видите -- мастера фк эсклюзивно хотят (это к Максу, он на них собаку съел)

а oi.base_crm_t2 -- это предок одной из ваших иерархий ? или что ?


PS вы написать
Код: sql
1.
PERFORM dblink_exec(conn, summary_ddl)

в вашем триггере ленитесь ?
...
Рейтинг: 0 / 0
Причины deadlock
    #39205176
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwqа oi.base_crm_t2
Это предок.

Вы предлагает использовать dblink для созданию партиций?
...
Рейтинг: 0 / 0
Причины deadlock
    #39205290
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trotqwwqа oi.base_crm_t2
Это предок.

Вы предлагает использовать dblink для созданию партиций?а как иначе сделать автономию. или у вас уже можно ?

сделать, но одним вызовом --ВЕСЬ ddl. [тут думать: не нужно ли обособить создание ФК т.е. что с чем в дедлок сцепляется.]

это [автономия], кстати говоря чревато некими обременениями по части правила писания кода. [пояляется возможность словить дедлока по ожиданию возврата - вы там в тему с ёшем ходили. т.е. неразрешимого в автомате]


По хорошему надо таймаут автономии давать через асинхронный вызов и/или pg_cancel_backend() и т.п. но это лишние сложности, пока логика вставки первичных данных проста.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Причины deadlock
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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