Как я могу выполнить атомарный выбор, используя несколько запросов в psql?

#sql #postgresql #concurrency #atomic

#sql #postgresql #параллелизм #атомарный

Вопрос:

Допустим, у меня есть postgresql db с 2 таблицами: User и Submission, и я делаю:

 SELECT * FROM User;
SELECT * FROM Submission;
 

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

Итак, у меня есть 2 вопроса:

  1. Как я могу атомарно извлекать данные из разных таблиц без какого-либо объединения или явной блокировки? Чтобы убедиться, что никакие изменения не были применены ни к одной таблице между запросами
  2. Какие запросы гарантируют атомарное поведение? Работает ли SELECT с ВНУТРЕННИМ соединением атомарно?

Ответ №1:

Запустите оба оператора в одной транзакции, для которой установлено значение repeatable read .

Цитата из руководства

Повторяемый уровень изоляции чтения видит только данные, зафиксированные до начала транзакции; он никогда не видит ни незафиксированных данных, ни изменений, зафиксированных во время выполнения транзакции параллельными транзакциями.


И да, один оператор всегда является атомарным. Он никогда не увидит изменений в базовых данных во время выполнения, даже если эти изменения зафиксированы во время выполнения инструкции.