powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Доработать запрос, чтобы не было параллельно выполнения одинаковых запросов
2 сообщений из 2, страница 1 из 1
Доработать запрос, чтобы не было параллельно выполнения одинаковых запросов
    #40131104
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Использую PostgresQL
Есть 2 таблицы autors и documents нужно для определённых аккаунтов обновить
информацию в autors по documents.

Код: 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.
CREATE TABLE autors (
	id serial PRIMARY KEY,
	author text,
    author_id int not null,
   docs int[]
);
insert into  autors( author, author_id, docs) values 
('Иванов', 3, ARRAY[1,2]),
('Петров', 4,  ARRAY[1,2]),
('Сидоров', 6,  ARRAY[1,2]),
('Сергеев', 5,  ARRAY[1,2]);


CREATE TABLE documents (
	id serial PRIMARY KEY,
	account int not null,
    author_id int not null,
   doc_id int
);
insert into  documents (account, author_id, doc_id) values 
(1,  3, 10),
(1, 4, 24),
(2, 5, 33),
(2, 3, 21);




Запрос:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with au as(
select autors.author_id, array_agg(documents.doc_id) as res
from autors
inner join documents ON (
  autors.author_id = documents.author_id
AND documents.account = ANY(ARRAY[1,2])
)
group by autors.author_id
)

update autors 
set docs = au.res
from au
where autors.author_id  = au.author_id 
returning autors .* 



Стала возникать проблема если например по аккаунту 1, одновременно
выполняются несколько одинаковых запросов, падает ошибка deadlock detected.

Хочется перед выполнение запроса как-то понимать, что c этими же аккаунтам
выполняется другой запрос, если выполняется, тогда текущий запрос не выполнять,
как это можно сделать?

Буду благодарен за конкретный пример
...
Рейтинг: 0 / 0
Доработать запрос, чтобы не было параллельно выполнения одинаковых запросов
    #40131119
Dzianis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А это реальный пример?
У меня появляются куча вопросов, а зачем дублировать у автора список его doc_id, когда их всегда можно получить запросом, проидексировать только.

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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with list as(
select d.author_id, array_agg(d.doc_id) as res
from documents d
WHERE	d.account = ANY(ARRAY[1,2])
group by d.author_id
)

update autors 
set docs = l.res
from list l
where autors.author_id  = l.author_id
AND		autors.docs <> l.res
returning autors .* ;
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Доработать запрос, чтобы не было параллельно выполнения одинаковых запросов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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