Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка canceling statement due to statement timeou 
:(
    Опции темы
polin11
Дата 5.6.2022, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 6.6.2015

Репутация: нет
Всего: нет



Использую PGSQL.
Есть таблица записей ~ 1000 000 записей

Код


CREATE TABLE forms (
    id serial PRIMARY KEY,
    account INT NOT NULL,
    author text,
    salary INT NOT NULL
);
INSERT INTO  forms(account, author, salary) VALUES 
(1100889, 'Иванов', 30),
(1100889, 'Петров', 40),
(4443, 'Сидоров', 40),
(1100889, 'Сергеев', 50)


При авторизации пользователя в аккаунт идет пересчет поля salary в целом по аккаунту для всех пользователей
Код

UPDATE forms
SET salary = (SELECT....)
WHERE account = 1100889

Перед обновление делаю блокировку по аккаунту с таймаутом 5 секунд.

Код

BEGIN ISOLATION LEVEL READ COMMITTED READ WRITE;
SET LOCAL statement_timeout = '5000ms'; 
SELECT PG_ADVISORY_XACT_LOCK("lock_id") FROM (
                SELECT UNNEST('{1100889}'::BIGINT[]) AS "lock_id"
            ) LocksId      
RESET statement_timeout


В процессе обновления могут выполнятся обновления по конкретному сотруднику из этого аккаунта, я также ставлю 
блокировку по аккаунту.
Код


UPDATE forms
SET salary = 100
WHERE account = 1100889 AND author = 'Иванов'


Когда общий запрос  обновления по аккаунту (большой аккаунт) выполняется долго > 5 секунд, 
то падает ошибка на второй запрос обновления 
по сотруднику ошибка canceling statement due to statement timeout.
Понятно, что оптимальное решение ускорить запрос расчета целиком по аккаунту. 

Плохо разбираюсь в тебе блокировок в PGSQL, просьба подсказать как исправить ситуацию с точки зрения 
блокировок, в какую сторону смотреть?

PM MAIL   Вверх
Akina
Дата 5.6.2022, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 3
Всего: 453



Цитата(polin11 @  5.6.2022,  17:02 Найти цитируемый пост)
При авторизации пользователя в аккаунт идет пересчет поля salary в целом по аккаунту для всех пользователей

Гм... а зачем?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
polin11
Дата 6.6.2022, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 6.6.2015

Репутация: нет
Всего: нет



После автозир. пользователя идет пересчет для всех пользователей, т.к. нужно пользователю показать salary из аккаунта всех пользователей из аккаунта.
А изменять конкретный пользователь может менять только свой salary
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PostgreSQL | Следующая тема »


 




[ Время генерации скрипта: 0.1204 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.