powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Блокировка при секционировании
6 сообщений из 6, страница 1 из 1
Блокировка при секционировании
    #39990381
VladimirDz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем дорого времени суток.

В ходе эксперимента возник такой вопрос при партицировании по блокировкам.
Данные и примеры беру отсюда https://postgrespro.ru/docs/postgresql/12/ddl-partitioning

-- Создание партицированной таблицы
CREATE TABLE test.measurement (
city_id int not null,
logdate date not null,
peaktemp int,
unitsales int
) PARTITION BY RANGE (logdate);

-- Создание секций/партиций
CREATE TABLE measurement_y2006m02 PARTITION OF test.measurement
FOR VALUES FROM ('2006-02-01') TO ('2006-03-01');
CREATE TABLE measurement_y2006m03 PARTITION OF test.measurement
FOR VALUES FROM ('2006-03-01') TO ('2006-04-01');
...
CREATE TABLE measurement_y2007m11 PARTITION OF test.measurement
FOR VALUES FROM ('2007-11-01') TO ('2007-12-01');
CREATE TABLE measurement_y2007m12 PARTITION OF test.measurement
FOR VALUES FROM ('2007-12-01') TO ('2008-01-01');
CREATE TABLE measurement_y2008m01 PARTITION OF test.measurement
FOR VALUES FROM ('2008-01-01') TO ('2008-02-01');

Теперь Эксперимент:

В 1-ой сессии выполняем
BEGIN;
SELECT count(*) FROM test.measurement WHERE logdate = DATE '2008-01-01';

Во 2-ой сессии делаем отдельную табличку
CREATE TABLE test.measurement_y2017m01 (LIKE test.measurement INCLUDING DEFAULTS INCLUDING CONSTRAINTS);
тут же делаем еще
begin;
ALTER TABLE test.measurement ATTACH PARTITION test.measurement_y2017m01
FOR VALUES FROM ('2017-01-01') TO ('2017-02-01');
и все напрочь зависает до тех пор, пока в 1-ой сессии не сделаем commit.

Перед attach также пробовал делать
ALTER TABLE test.measurement_y2017m01 ADD CONSTRAINT y2017m01
CHECK ( logdate >= DATE '2017-01-01' AND logdate < DATE '2017-02-01' );
но и это не помогает.

По идее такого не должно быть.
Так же плотно рассматривал интереснейшую статью на хабре https://habr.com/ru/company/postgrespro/blog/456716/

Но ни по справке, ни по статье с хабра у меня не получается обойти блокировку. Если у кого-то был аналогичный удачный опыт, то поделитесь пожалуйста.
...
Рейтинг: 0 / 0
Блокировка при секционировании
    #39990384
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladimirDz,

Любой alter table требует блокировки на ту таблицу что alter им
а открытые запросы этому мешают.
Вы никакой alter table test.measurement не внесете пока есть открытые транзакции которые с ней работают.
Это прекрасно все документировано
https://www.postgresql.org/docs/12/explicit-locking.html#LOCKING-TABLES

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Блокировка при секционировании
    #39990447
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladimirDz
Теперь Эксперимент:

В 1-ой сессии выполняем
BEGIN;
SELECT count(*) FROM test.measurement WHERE logdate = DATE '2008-01-01';

Во 2-ой сессии делаем отдельную табличку
CREATE TABLE test.measurement_y2017m01 (LIKE test.measurement INCLUDING DEFAULTS INCLUDING CONSTRAINTS);
тут же делаем еще
begin;
ALTER TABLE test.measurement ATTACH PARTITION test.measurement_y2017m01
FOR VALUES FROM ('2017-01-01') TO ('2017-02-01');
и все напрочь зависает до тех пор, пока в 1-ой сессии не сделаем commit.

Я даже повторил эксперимент. Ничего в этом месте не повисает, всё работает.
Отключить (detach) секцию без блокировки запросов нельзя, а подключить можно.

Всё что могу предположить, что эксперимент проводите на версии меньше чем 12-я?
...
Рейтинг: 0 / 0
Блокировка при секционировании
    #39990449
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk

Вы никакой alter table test.measurement не внесете пока есть открытые транзакции которые с ней работают.

В 12-й версии для alter table .. attach partition понизили уровень блокировки на родительскую таблицу до SHARE UPDATE EXCLUSIVE. Это позволяет параллельно выполнять dml запросы к таблице. А вот для отключения секции (detach partition) по-прежнему требуется ACCESS EXCLUSIVE.
...
Рейтинг: 0 / 0
Блокировка при секционировании
    #39990465
VladimirDz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо Павел Лузанов, так и есть. Я вчера действительно ошибся с версией. Пробовал на 11-ой. Сегодня поставил 12-ую и провел эксперимент. Все удачно.

Еще раз привожу детали (теперь уже успешного эксперимента)

! Только для 12-ой версии постгреса

в 1-ой сессии делаем блокировку так:
BEGIN;
SELECT count(*) FROM test.measurement WHERE logdate > DATE '2007-01-01';
проверяем в 1-ой

SELECT relation::regclass::text, mode FROM pg_locks
WHERE pid = pg_backend_pid() AND relation::regclass::text LIKE 'test.measurement%';

Получаем:
--------------------------------------
relation | mode
--------------------------------------
test.measurement | AccessShareLock
--
во 2-ой сесии делаем отдельную табличку
CREATE TABLE test.measurement_y2017m01 (LIKE test.measurement INCLUDING DEFAULTS INCLUDING CONSTRAINTS);
и появляется отдельная табличка
-- тоже во 2-ой сессии
begin;
ALTER TABLE test.measurement ATTACH PARTITION test.measurement_y2017m01
FOR VALUES FROM ('2017-01-01') TO ('2017-02-01');
-- Проверяем во 2-ой блокировки
SELECT relation::regclass::text, mode FROM pg_locks
WHERE pid = pg_backend_pid() AND relation::regclass::text LIKE 'test.measurement%';
Получаем
----------------------------------------------------------------------
relation | mode
----------------------------------------------------------------------
test.measurement | ShareUpdateExclusiveLock
----------------------------------------------------------------------
test.measurement_y2017m01 | AccessExclusiveLock
----------------------------------------------------------------------
во 2-ой
commit;
И секция добавляется.!!!

Вспоминаем про первую сессию, которая все еще висит
теперь можно и в 1-ой сделать.
commit;

P.S.
А вот DROP TABLE test.measurement_y2017m01; действительно так и не будет работать, пока в первой сессии не сделаем комит (то есть пока висит 1-ая сессия удалить партицию не получится).
...
Рейтинг: 0 / 0
Блокировка при секционировании
    #39990470
VladimirDz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас еще с truncate попробовал провести такой же трюк. то есть завеил первую сессию и пока она висит во второй сделал truncate.
Этот номер не проходит, вторая сессия с truncate будет висеть пока первая сиссия не будет закомичена.

Еще раз спасибо Павлу за его материалы и ответы. Помогло очень разобраться.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Блокировка при секционировании
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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