Распределённые данные · проверено по источникам

Сериализуемость

Сериализуемость — свойство выполнения транзакций: результат зафиксированных параллельных операций эквивалентен их выполнению по одной в некотором порядке. Реальные операции могут перекрываться во времени; совпасть должен допустимый последовательный результат.

Также ищут: Serializability · serializable execution

Практический смысл

Почему это важно

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

Доказательная часть

Что подтверждено

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

    Граница применимости: Гарантия изоляции Serializable в модели SQL.

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

    Граница применимости: Сравнение изоляции транзакций SQL и корректности параллельных объектов по Херлихи и Уинг; линеаризуемость не названа следующим уровнем изоляции SQL.

  3. PostgreSQL Serializable допускает параллельное выполнение и отслеживает опасные зависимости между транзакциями. При необходимости он отклоняет попытку с ошибкой сериализации. Поэтому этот режим не означает ни выполнение всех запросов по очереди, ни отсутствие повторов.

    Граница применимости: PostgreSQL 18, сериализуемая изоляция на основе снимков; не обещается минимально возможное число отклонений.

  4. Предикатные блокировки PostgreSQL Serializable служат для обнаружения зависимостей чтения и записи. Сами эти блокировки не задерживают другие транзакции и не вызывают взаимоблокировки; обычные блокировки строк и таблиц при этом продолжают действовать.

    Граница применимости: PostgreSQL 18, предикатные блокировки Serializable, а не любые блокировки базы.

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

    Граница применимости: Вывод из гарантии Serializable и роли ограничений PostgreSQL; защита от параллелизма отличается от корректности приложения.

  6. Настройка Serializable в одном соединении не переводит остальные операции в этот режим. Гарантию общего правила проверяют по всем транзакциям, которые читают и меняют участвующие в нём данные, включая фоновые задачи и административные записи.

    Граница применимости: PostgreSQL 18: применение рекомендаций Serializable к полной группе операций, от которой зависит правило.

Граница терминов

Не путать

Линеаризуемость

Сериализуемость задаёт последовательную эквивалентность транзакций. Линеаризуемость задаёт допустимую историю операций объекта с порядком завершённых вызовов. Сначала определяют границу операции, затем сравнивают гарантии.

Многоверсионное управление доступом (MVCC)

MVCC выбирает видимые версии данных. Сериализуемость требует допустимого общего результата транзакций. PostgreSQL использует многоверсионность на нескольких уровнях изоляции, поэтому слово MVCC не подтверждает Serializable.

Перед спецификацией

Что проверить

  1. Опишите границы одной транзакции и правило, которое она должна сохранять.
  2. Проверьте это правило сначала при последовательном выполнении.
  3. Включите в проверку все пути изменения данных, в том числе фоновые задания.
  4. Испытайте параллельные решения по одному условию, даже если записываются разные строки.
  5. Подготовьте повтор всей транзакции после ошибки сериализации.
  6. Измеряйте число повторов на рабочей нагрузке; не обещайте отсутствие конфликтов.
  7. Требование к чтению после завершённой записи сформулируйте отдельно от названия уровня изоляции.
Открытые основания

Первоисточники

  • Официальная документация

    PostgreSQL 18 Documentation: Transaction Isolation

    PostgreSQL Global Development Group · PostgreSQL 18, Chapter 13.2

    Определяет isolation phenomena и фактическое поведение PostgreSQL levels, включая Serializable.

    Открыть первоисточник
  • Первичная публикация

    Linearizability: A Correctness Condition for Concurrent Objects

    Carnegie Mellon University / ACM · Herlihy and Wing, ACM TOPLAS 12(3), July 1990

    Даёт формальное real-time correctness condition для concurrent operations.

    Открыть первоисточник
  • Официальная документация

    PostgreSQL 18 Documentation: Explicit Locking

    PostgreSQL Global Development Group · документация PostgreSQL 18, страница открыта 7 сентября 2026 года

    Открыт редактором 7 сентября 2026 года, заголовок документа сверен. Проверить блокировки строк SELECT FOR UPDATE, ожидание конкурирующих изменений и срок удержания до конца транзакции.

    Открыть первоисточник
  • Официальная документация

    PostgreSQL 18 Documentation: Constraints

    PostgreSQL Global Development Group · документация PostgreSQL 18, страница открыта 7 сентября 2026 года

    Открыт редактором 7 сентября 2026 года, заголовок документа сверен. Проверить CHECK и NULL, NOT NULL, UNIQUE и границу проверок одной строки; пример заказа — редакторское применение этих правил.

    Открыть первоисточник
  • Официальная документация

    PostgreSQL 18 Documentation: Introduction to MVCC

    PostgreSQL Global Development Group · PostgreSQL 18, Chapter 13.1

    Объясняет multiversion snapshots и границу между MVCC и explicit locking.

    Открыть первоисточник
Сообщить об ошибке

Опишите проблему — постараемся исправить как можно скорее.

Спасибо!

Получили ваше сообщение.
Подтвердите действие