Реализация ACID в базах данных

Обработка транзакции часто требует последовательности операций, которая может выйти из строя по ряду причин. Например, в системе может не осталось места на дисках или она израсходовала выделенное время ЦП. Существует два популярных семейства методов: ведение журнала с упреждающей записью и теневая подкачка. В обоих случаях необходимо установить блокировки для всей обновляемой информации и, в зависимости от уровня изоляции, возможно, для всех данных, которые также могут быть прочитаны. При ведении журнала с упреждающей записью надежность гарантируется путем копирования исходных (неизмененных) данных в журнал перед изменением базы данных. Это позволяет базе данных вернуться в согласованное состояние в случае сбоя. При теневом копировании обновления применяются к частичной копии базы данных, и новая копия активируется при фиксации транзакции.

Блокировка и многоверсионность

Многие базы данных полагаются на блокировку для обеспечения возможностей ACID. Блокировка означает, что транзакция помечает данные, к которым она обращается, чтобы СУБД знала, что не разрешает другим транзакциям изменять их, пока первая транзакция не завершится успешно или не завершится неудачно. Блокировка всегда должна быть получена перед обработкой данных, включая данные, которые читаются, но не изменяются. Нетривиальные транзакции обычно требуют большого количества блокировок, что приводит к значительным накладным расходам, а также к блокировке других транзакций. Например, если пользователь A выполняет транзакцию, которая должна прочитать строку данных, которые пользователь B хочет изменить, пользователь B должен дождаться завершения транзакции пользователя A. Двухфазная синхронизация часто применяется для гарантии полной изоляции.

Альтернативой блокировке является мультиверсионное управление параллелизмом, при котором база данных предоставляет каждой транзакции чтения предыдущую, неизмененную версию данных, которые изменяются другой активной транзакцией. Это позволяет считывающим устройствам работать без получения блокировок, то есть транзакции записи не блокируют транзакции чтения, а считыватели не блокируют средства записи. Возвращаясь к примеру, когда транзакция пользователя A запрашивает данные, которые изменяет пользователь B, база данных предоставляет A версию этих данных, которые существовали, когда пользователь B начал свою транзакцию. Пользователь А получает согласованное представление о базе данных, даже если другие пользователи меняют данные. Одна из реализаций, а именно изоляция моментальных снимков, ослабляет свойство изоляции.

Распределенные транзакции

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


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

Комментарии

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

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

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

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