Я пытаюсь выполнить ALTER TABLE на огромной таблице без блокировки полного доступа. Согласно ALTER TABLE документации:PostgreSQL ALTER TABLE Явная блокировка не работает должным образом
доступ EXCLUSIVE блокировка сохраняется до тех пор явно отметил
Поэтому я следующее:
BEGIN;
LOCK TABLE MyTable IN SHARE MODE;
ALTER TABLE MyTable ALTER COLUMN size SET DATA TYPE BIGINT;
COMMIT;
Я ожидаю, что это дает мне возможность выполнения запросов SELECT во время обновления. Но на самом деле это не так. Глядя на pg_locks во время операции я обнаружил, что:
SELECT c.relname, l.mode, l.granted, l.pid
FROM pg_locks as l JOIN pg_class as c on c.oid = l.relation
WHERE relname='MyTable' AND granted IS TRUE;
relname | mode | granted | pid
----------+---------------------+---------+------
MyTable | ShareLock | t | 2277
MyTable | AccessExclusiveLock | t | 2277
Так AccessExclusiveLock неожиданно было взят хорошо, и это объясняет, почему мои ВЫБИРАЕТ не висит до конца сделки
я использую PostgreSQL 9.4
О, вот что это значит. Спасибо за объяснение. –