что не смог эксклюзивно заблокировать таблицу?
А он смог. Упомянутые долгие транзакции [пока] не связаны с этой таблицей.
То есть транзакции должны упасть при попытке связаться?
Нет. Они должны прочитать rows, актуальные для их snapshot.
это зависит от выбранного уровня изоляции? пытаюсь повторить проблему, в одном соеднии делаю update на тестовой таблице, в другом соединии начинаю транзакцию, в первом делаю vacuum full - таблица урезается несмотря на активную более старую странзакцию
неправильно эксперимент делал, более старая транзакция должна удаленные строки живыми видеть (я уже после update но до vacuum запускал), после исправления проблема воспроизвелась
Да, всё так. На всякий случай, транзакция в PostgreSQL "на самом деле" начинается (берёт первый snapshot) не с "BEGIN TRANSACTION;", а с первого DML statement в ней (я к тому, что об этом стоит помнить, когда экспериментируете).
Т.е. если между ними есть DDL, он исключается из транзакции? 8-O
это только в ORACLE так. в Postgres-е чтобы не накручивать счётчик используются виртуальные номера транзакций до момента, когда транзакция явно что-то меняет и нужен новый номер
Я просто имел в виду, что, к примеру: "BEGIN TRANSACTION; SET TRANSACTION READ ONLY;" и т.п. snapshot-а не берут. Viktor Grigorev же с этим экспериментировал, так что я не стал расписывать. Правильнее будет "с первого не-TCL statement".
Обсуждают сегодня