12
Много клиентов
клиентское
приложение
PostgreSQL
postmaster
backend
фоновые процессы
общая память
MVCC
блокировки
Когда к серверу подключается много клиентов, для каждого из них
порождается собственный обслуживающий процесс. Это не проблема,
пока клиентов не очень много: на всех хватает оперативной памяти,
а соединения не происходят слишком часто.
Тем не менее при одновременной работе с какими-либо объектами
приходится принимать меры, чтобы один процесс не поменял какие-то
данные в то время, пока с ними работает другой процесс.
Для объектов в общей памяти используются короткоживущие
блокировки. PostgreSQL делает это достаточно аккуратно для того,
чтобы система хорошо масштабировалась при увеличении числа
процессоров (ядер).
С таблицами сложнее, поскольку блокировки нужно удерживать
до конца транзакций (то есть потенциально в течение длительного
времени), из-за чего масштабируемость может пострадать. Поэтому
PostgreSQL использует механизм многоверсионности (MVCC,
multiversion concurrency control) и изоляцию на основе снимков данных:
одни и те же данные могут одновременно существовать в разных
версиях, а каждый процесс видит собственную (но всегда
согласованную) картину данных. Это позволяет блокировать только
те процессы, которые пытаются изменить данные, уже измененные,
но еще не зафиксированные другими процессами.
Многоверсионность — основной механизм, который обеспечивает
первые три свойства транзакций (атомарность, согласованность,
изоляция). Про него мы будем говорить отдельно в теме «Изоляция
и многоверсионность».