Каковы последствия производительности различных уровней изоляции в PostgreSQL? - PullRequest
0 голосов
/ 22 февраля 2019

Я пишу архивный скрипт (на Python с использованием psycopg2), который должен извлечь очень большой объем данных из базы данных PostgreSQL (9.4), обработать, загрузить и затем удалить его из базы данных.

Я запускаю транзакцию, выполняю оператор выбора для создания именованного курсора, извлекаю из курсора N строк за раз и выполняю обработку и выгрузку деталей (используя S3 multipart upload).Когда курсор исчерпан и ошибок нет, я завершаю загрузку и выполняю оператор удаления, используя те же условия, что и в select.Если удаление выполнено успешно, я фиксирую транзакцию.

База данных активно записывается, и важно, чтобы обе одинаковые строки были заархивированы и удалены, а также считывались и записывались в базу данных (включая архивируемую таблицу)продолжать непрерывноПри этом архивируемые таблицы содержат журналы, поэтому существующие записи никогда не изменяются, добавляются только новые записи.

Итак, у меня есть следующие вопросы:

Какой уровень изоляции я должен использовать длягарантировать, что одни и те же строки будут заархивированы и удалены?

Какое влияние эти операции окажут на способность чтения / записи в базу данных?Что-нибудь блокирует запись или чтение в процессе, который я описал выше?

1 Ответ

0 голосов
/ 22 февраля 2019

У вас есть два хороших варианта:

  1. Получите данные с помощью

    SELECT ... FOR UPDATE
    

    , чтобы строки были заблокированы.Тогда гарантированно будет там, когда вы их удалите.

  2. Используйте

    DELETE FROM ... RETURNING *
    

    Затем вставьте возвращенные строки в ваш архив.

Второе решение лучше, потому что вам нужно только одно утверждение.

Ничего плохого не может произойти.Если по какой-либо причине транзакция завершится неудачей, строка не будет удалена.

Вы можете использовать уровень изоляции по умолчанию READ COMMITTED для обоих решений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...