Открыть сервис

Управление параллельным доступом

Управление параллельным доступом (англ. concurrency control) — это механизм, обеспечивающий корректное выполнение одновременных транзакций в многопользовательских системах управления базами данных (СУБД), операционных системах и других вычислительных средах. Основная цель управления параллельным доступом — предотвращение конфликтов, возникающих при одновременном чтении и изменении одних и тех же данных, и гарантирование согласованности, изолированности и целостности данных. Управление параллельным доступом является фундаментальным компонентом систем, где несколько процессов или пользователей могут одновременно обращаться к общим ресурсам.

Основные проблемы параллельного доступа

При одновременном выполнении нескольких транзакций без надлежащего управления могут возникать следующие проблемы:

  • Потерянное обновление (lost update) — возникает, когда две транзакции одновременно читают одно и то же значение, изменяют его и записывают результат. В итоге запись одной транзакции перезаписывает запись другой, и первое изменение теряется.
  • «Грязное» чтение (dirty read) — транзакция читает данные, которые были изменены другой, ещё не завершённой транзакцией. Если вторая транзакция впоследствии откатывается, прочитанные данные оказываются недействительными.
  • Неповторяющееся чтение (non-repeatable read) — при повторном чтении одних и тех же данных в рамках одной транзакции получаются разные результаты, так как другая транзакция успела изменить эти данные между двумя чтениями.
  • Фантомное чтение (phantom read) — при повторном выполнении одного и того же запроса в рамках транзакции возвращается разное количество строк, так как другая транзакция добавила или удалила строки, удовлетворяющие условию запроса.

Модели управления параллельным доступом

Существует несколько основных подходов к управлению параллельным доступом, различающихся по принципам обработки конфликтов и уровню изоляции транзакций.

Оптимистическое управление (Optimistic Concurrency Control)

Оптимистическое управление основано на предположении, что конфликты между транзакциями редки. Транзакции выполняются без блокировок, а перед фиксацией проверяется, не возникли ли конфликты с другими транзакциями. Если конфликт обнаружен, транзакция откатывается и повторяется. Этот подход эффективен в системах с низкой конкуренцией за данные, например, в веб-приложениях с большим количеством чтений и редкими записями.

Пессимистическое управление (Pessimistic Concurrency Control)

Пессимистическое управление предполагает, что конфликты вероятны, и поэтому блокирует ресурсы на время выполнения транзакции. Другие транзакции, пытающиеся получить доступ к заблокированным данным, вынуждены ждать. Этот подход гарантирует отсутствие конфликтов, но может снижать производительность из-за простоев. Пессимистическое управление широко применяется в реляционных СУБД, таких как PostgreSQL, MySQL и Oracle Database.

Многоверсионное управление (Multiversion Concurrency Control, MVCC)

Многоверсионное управление — это метод, при котором каждой транзакции предоставляется «снимок» данных на момент её начала. Транзакции работают с этим снимком, не видя изменений, внесённых другими транзакциями. При записи создаётся новая версия данных, а старые версии сохраняются для чтения другими транзакциями. MVCC позволяет избежать блокировок при чтении и обеспечивает высокую степень параллелизма. Этот метод используется в PostgreSQL, Oracle Database, InnoDB (MySQL) и других СУБД.

Механизмы реализации

Блокировки

Блокировки — это наиболее распространённый механизм пессимистического управления. Различают несколько типов блокировок:

  • Разделяемая блокировка (S-lock) — позволяет нескольким транзакциям одновременно читать данные, но запрещает их изменение.
  • Исключительная блокировка (X-lock) — предоставляет транзакции исключительное право на чтение и изменение данных, блокируя доступ другим транзакциям.
  • Блокировки с намерением (intention locks) — используются для организации иерархических блокировок (например, на уровне таблицы и строки) и предотвращения конфликтов между ними.

Уровни изоляции транзакций

Стандарт SQL определяет четыре уровня изоляции, которые регулируют, какие проблемы параллельного доступа допускаются:

  • Read Uncommitted — допускает «грязное» чтение. Самый низкий уровень изоляции, практически не используется.
  • Read Committed — предотвращает «грязное» чтение, но допускает неповторяющееся и фантомное чтение. Уровень по умолчанию в большинстве СУБД (например, PostgreSQL, Oracle Database).
  • Repeatable Read — предотвращает «грязное» и неповторяющееся чтение, но допускает фантомное чтение. В некоторых СУБД (например, PostgreSQL) этот уровень также предотвращает фантомное чтение.
  • Serializable — полностью изолирует транзакции, гарантируя, что их параллельное выполнение эквивалентно последовательному. Самый высокий уровень изоляции, но с наибольшими накладными расходами.

Протоколы сериализации

Для обеспечения сериализуемости (эквивалентности последовательному выполнению) используются протоколы, такие как:

  • Двухфазный протокол блокировок (2PL) — транзакция проходит две фазы: фазу захвата блокировок (наращивания) и фазу освобождения блокировок (сжатия). После начала фазы освобождения транзакция не может захватывать новые блокировки. 2PL гарантирует сериализуемость, но может приводить к взаимоблокировкам (deadlocks).
  • Протокол временных меток — каждой транзакции присваивается временная метка, и порядок выполнения определяется по этим меткам. Конфликты разрешаются откатом одной из транзакций.

Применение

Управление параллельным доступом применяется в различных областях:

  • Реляционные базы данных — обеспечение ACID-свойств (атомарность, согласованность, изолированность, долговечность) транзакций.
  • Операционные системысинхронизация доступа к файлам и другим ресурсам между процессами и потоками.
  • Распределённые системы — координация доступа к данным в распределённых базах данных и блокчейн-сетях.
  • Веб-приложения — обработка одновременных запросов пользователей, особенно в системах с высокой нагрузкой (например, интернет-магазины, социальные сети).

Критика и ограничения

Управление параллельным доступом, особенно пессимистическое, может приводить к снижению производительности из-за блокировок и простоев. В распределённых системах сложность управления возрастает из-за задержек сети и возможности сбоев. Многоверсионное управление, хотя и эффективно, требует дополнительных ресурсов для хранения версий данных и может усложнять реализацию некоторых операций, таких как проверка ограничений целостности.

Источники

  • Гарсиа-Молина, Г., Ульман, Дж., Уидом, Дж. «Системы баз данных: полный курс».
  • Селф, Дж. «Concurrency Control in Database Systems».
  • Стандарт ISO/IEC 9075:2023 «Information technology — Database languages — SQL».
  • Документация PostgreSQL, MySQL, Oracle Database.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →