training-web.ruГлавнаяКатегорииО насКарта сайтаПоискТёмная тема

Категории

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

Создано: 16 февраля 2025Автор: Егор Астапов80 просмотровСложность: легкий

Поговорим про уровни изоляции транзакций PostgreSQL. На собеседованиях часто спрашивают про уровни изоляции. Когда меня спросили, то я смог вспомнить только один уровень. Было обидно. Обычно текущий уровень меняют из большого трафика. Если в одну таблицу постоянно записывают данные в большом количестве, то лучше поменять уровень изоляции. Если несколько тысяч обновлений в секунду терпит ваша таблица, то могу возникать проблемы. Тут нежно экспериментировать. В PostgreSQL существует четыре уровня изоляции транзакций, которые определяют, как изменения, сделанные одной транзакцией, видны другим транзакциям. Эти уровни соответствуют стандарту SQL и помогают управлять конкурентным доступом к данным:

  1. Read Uncommitted (Чтение незафиксированных данных). На этом уровне транзакции могут видеть изменения, сделанные другими транзакциями, даже если эти изменения не были зафиксированы. Однако в PostgreSQL этот уровень не поддерживается, и фактически он работает как 'Read Committed'.
  2. Read Committed (Чтение зафиксированных данных). На этом уровне каждая транзакция видит только те изменения, которые были зафиксированы до начала выполнения запроса. Это означает, что если одна транзакция вносит изменения, а другая начинает выполняться после этого, но до завершения первой, то вторая транзакция не увидит этих изменений. Однако изменения могут появиться, если новая транзакция выполнит другой запрос после фиксации первой транзакции.
  3. Repeatable Read (Повторяемое чтение). Этот уровень обеспечивает более строгую изоляцию. Транзакция будет видеть только те данные, которые были зафиксированы до начала транзакции. Даже если другие транзакции вносят изменения и фиксируют их, текущее состояние данных для этой транзакции останется неизменным в ходе ее выполнения. Однако это может привести к ситуации «фантомного чтения», когда новые строки, соответствующие условиям запроса, могут быть добавлены другими транзакциями в процессе выполнения текущей транзакции.
  4. Serializable (Сериализуемый). Этот уровень является самым строгим и обеспечивает полную изоляцию, гарантируя, что результаты выполнения транзакций будут теми же, как если бы они были выполнены последовательно (одна за другой). PostgreSQL использует механизм, основанный на многоверсионной модели управления конкурентами (MVCC), для обеспечения сериализуемости. Это может привести к отмене (rollback) транзакции, если система определит, что ее выполнение может привести к конфликту с другой транзакцией.

Выбор уровня изоляции зависит от требований вашей системы к согласованности данных и производительности. Уровень `Read Committed` является наиболее часто используемым, так как предоставляет хороший баланс между производительностью и целостностью данных. Для интернет-магазинов лучше использовать Serializable уровень изоляции. Один товар может купить только один покупатель. Одна бутылка пива не делится на 2 покупателя и она должна достаться только одному покупателю!

Уровень изоляции в базах данных может задаваться как глобально, так и на уровне отдельных транзакций или таблиц, в зависимости от используемой системы управления базами данных (СУБД).

  1. Глобальный уровень. В некоторых системах управления базами данных уровень изоляции может быть установлен для всей базы данных или для всех сессий, что будет действовать по умолчанию для всех транзакций, если не будет указано иное.
  2. Транзакционный уровень. Большинство современных СУБД позволяют задавать уровень изоляции на уровне отдельных транзакций. Это означает, что при начале транзакции можно указать желаемый уровень изоляции, который будет применяться только к этой конкретной транзакции.
  3. Уровень таблиц. В большинстве СУБД уровень изоляции не может быть установлен на уровне отдельных таблиц. Однако можно использовать механизмы блокировок и другие средства для управления доступом к данным на уровне таблиц.

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

Уровень изоляции Потерянные изменения Неаккуратное считывание Неповторяемое считывание Фиктивные элементы
Read uncomitted Нет Да Да Да
Read comitted Нет Нет Да Да
Repeatable read Нет Нет Нет Да
Serializable Нет Нет Нет Нет

ACID — это набор свойств, который обеспечивает надежную обработку транзакций в системах управления базами данных. Он включает в себя четыре ключевых атрибута:

  1. Atomicity (Атомарность): Транзакция рассматривается как единое целое, которое либо выполняется полностью, либо не выполняется вовсе. Если одна часть транзакции не может быть выполнена, то все изменения отменяются.
  2. Consistency (Согласованность): Транзакция переводит базу данных из одного согласованного состояния в другое. Это означает, что все бизнес-правила и ограничения целостности должны сохраняться после выполнения транзакции.
  3. Isolation (Изоляция): Каждая транзакция выполняется независимо от других. Это свойство гарантирует, что результаты одной транзакции не видны другим транзакциям, пока они не завершены.
  4. Durability (Надежность): После завершения транзакции все изменения, внесенные ей в базу данных, сохраняются, даже в случае сбоя системы. Это достигается с помощью журналирования и других механизмов.

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

Комментарии

реклама