Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PostgreSQL > Ошибка canceling statement due to statement timeou


Автор: polin11 5.6.2022, 16:02
Использую 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, просьба подсказать как исправить ситуацию с точки зрения 
блокировок, в какую сторону смотреть?

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

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

Автор: polin11 6.6.2022, 13:35
После автозир. пользователя идет пересчет для всех пользователей, т.к. нужно пользователю показать salary из аккаунта всех пользователей из аккаунта.
А изменять конкретный пользователь может менять только свой salary

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)