#sql #postgresql #concurrency #atomic
#sql #postgresql #параллелизм #атомарный
Вопрос:
Допустим, у меня есть postgresql db с 2 таблицами: User и Submission, и я делаю:
SELECT * FROM User;
SELECT * FROM Submission;
Как вы видите, это два запроса, поэтому некоторые изменения могут быть применены к любой таблице между запросами
Итак, у меня есть 2 вопроса:
- Как я могу атомарно извлекать данные из разных таблиц без какого-либо объединения или явной блокировки? Чтобы убедиться, что никакие изменения не были применены ни к одной таблице между запросами
- Какие запросы гарантируют атомарное поведение? Работает ли SELECT с ВНУТРЕННИМ соединением атомарно?
Ответ №1:
Запустите оба оператора в одной транзакции, для которой установлено значение repeatable read
.
Повторяемый уровень изоляции чтения видит только данные, зафиксированные до начала транзакции; он никогда не видит ни незафиксированных данных, ни изменений, зафиксированных во время выполнения транзакции параллельными транзакциями.
И да, один оператор всегда является атомарным. Он никогда не увидит изменений в базовых данных во время выполнения, даже если эти изменения зафиксированы во время выполнения инструкции.