Уровни изоляции в базах данных

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

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

Поскольку каждый уровень изоляции сильнее, чем нижеприведенные, в том смысле, что более высокий уровень изоляции не допускает действия, запрещенного более низким, стандарт разрешает СУБД выполнять транзакцию на более высоком уровне изоляции, чем запрошенный (например, "Read committed" транзакция может фактически выполняться на уровне изоляции "Repeatable read").

Уровни изоляции, определенные стандартом ANSI/ISO SQL, перечислены ниже.

Serializable (упорядочиваемость)

Это высший уровень изоляции.

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

При использовании управления конкурентностью без блокировки блокировки не устанавливаются; однако, если система обнаруживает конфликт записи между несколькими конкурентными транзакциями, только одной из них разрешается зафиксировать.

Гарантированно сериализуемое выполнение параллельных SQL-транзакций на уровне изоляции SERIALIZABLE. Сериализуемое выполнение определяется как выполнение операций одновременного выполнения SQL-транзакций, которые производят тот же эффект, что и последовательное выполнение тех же самых SQL-транзакций. Последовательное выполнение - это то, при котором каждая SQL-транзакция выполняется до завершения до начала следующей SQL-транзакции.

Repeatable reads (Повторяющиеся чтения)

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

На этом уровне изоляции возможен перекос при записи (write skew), явление, когда две записи разрешены в один и тот же столбец (столбцы) таблицы двумя разными авторами (которые ранее читали столбцы, которые они обновляют), в результате чего столбец имеет данные, которые являются результатом сочетания двух транзакций.

Read committed (чтение фиксированных данных)

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

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

Read uncommitted (чтение незафиксированных данных)

Это самый низкий уровень изоляции. На этом уровне разрешены грязные чтения, поэтому одна транзакция может видеть еще не зафиксированные изменения, сделанные другими транзакциями.

Уровень изоляции по умолчанию

Уровень изоляции различных СУБД по умолчанию варьируется в широких пределах. Большинство баз данных, в которых есть транзакции, позволяют пользователю устанавливать любой уровень изоляции. Некоторым СУБД также требуется дополнительный синтаксис при выполнении оператора SELECT для получения блокировок (например, SELECT ... FOR UPDATE для получения эксклюзивных блокировок записи для строк, к которым осуществляется доступ).

Поведение при различных уровнях изолированности

«+» — предотвращает, «-» — не предотвращает.

Уровень изоляции Фантомное чтение Неповторяющееся чтение "Грязное" чтение Потерянное обновление
SERIALIZABLE + + + +
REPEATABLE READ - + + +
READ COMMITTED - - + +
READ UNCOMMITTED - - - +

Читайте также:

Комментарии

Популярные сообщения из этого блога

Язык поисковых запросов в Graylog

Хэш-таблица: разрешение коллизий

Нормальные формы, пример нормализации в базе данных