LINUX.ORG.RU

Ошибки deadlock detected

 ,


0

1

Использую PGSQL. Есть таблица записей ~ 1000K записей https://www.db-fiddle.com/f/efkuMVy21JWNTE1HyTgYYk/0

CREATE TABLE forms (
	id serial PRIMARY KEY,
	account int not null,
	author text,
    salary int NOT NULL
);
insert into  forms(account, author, salary) values 
(1, 'Иванов', 30),
(1, 'Петров', 40),
(2, 'Сидоров', 40),
(2, 'Сергеев', 50)
Есть запросы с UPDATE, INSERT, DELETE к этой таблице. стали падать ошибки
ERROR: deadlock detected
DETAIL: Process 3415 waits for ShareLock on transaction 1958114794; blocked by process 87442.
Process 87442 waits for ShareLock on transaction 1958114529; blocked by process 3415.
HINT: See server log for query details.
Решил сделать блокировку по аккаунту на 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
Это помогло избавиться от deadlock detected, но возникла другая проблема. Если происходят частые вызовы 10 вызовов с интервалом 0.1 секунды для обновления сотрудников из одного аккаунта, то блокировку невозможно создать. Сами запросы сильно не тормозят, пробовал их ускорить по максимуму.

Есть ли какие-нибудь универсальные решения таких проблем? Может кто-то сталкивался, есть общие советы? Можно ли почитать что-нибудь по данному вопросу?

Решение простое - отлавливаешь эту ошибку в своём приложении и перезапускаешь транзакцию с начала.

Можешь попробовать понизить уровень изоляции, если для тебя это приемлемо.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)

spring-retry, lol

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

izzholtik ★★★
()
Последнее исправление: izzholtik (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.