Транзакция (информатика): различия между версиями

[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Уточнение названий, пунктуация
Строка 41:
Во время выполнения транзакции параллельные транзакции не должны оказывать влияние на её результат. Это свойство не соблюдается на [[Уровень изолированности транзакций|уровне изолированности]] Repeatable Read и ниже.
 
=== {{якорь|Durability  — Надежность}} Durability — Надёжность ===
 
Независимо от проблем на нижних уровнях (к примеру, обесточивание системы или сбои в оборудовании), изменения, сделанные успешно завершённой транзакцией, должны остаться сохранёнными после возвращения системы в работу. Другими словами, если пользователь получил подтверждение от системы, что транзакция выполнена, он может быть уверен, что сделанные им изменения не будут отменены из-за какого-либо сбоя.
Строка 53:
* '''1 — Чтение подтверждённых данных''' (Read Committed) — чтение всех изменений своей транзакции и зафиксированных изменений параллельных транзакций. Потерянные изменения и грязное чтение не допускается, возможны неповторяемое чтение и фантомы.
* '''2 — Повторяемое чтение''' (Repeatable Read, Snapshot) — чтение всех изменений своей транзакции, любые изменения, внесённые параллельными транзакциями после начала своей, недоступны. Потерянные изменения, грязное и неповторяемое чтение невозможны, возможны фантомы.
* '''3 — Сериализуемый (упорядочиваемость)''' — (Serializable) — [[Сериализуемость|сериализуемые]] транзакции. Результат параллельного выполнения сериализуемой транзакции с другими транзакциями должен быть логически эквивалентен результату их какого-либо последовательного выполнения. Проблемы синхронизации не возникают.
 
Чем выше уровень изоляции, тем больше требуется ресурсов, чтобы его обеспечить. Соответственно, повышение изолированности может приводить к снижению скорости выполнения параллельных транзакций, что является «платой» за повышение надёжности.
Строка 64:
 
Первые коммерческие СУБД (к примеру, IBM [[DB2]]), пользовались исключительно блокировкой доступа к данным для обеспечения свойств ACID. Но большое количество блокировок приводит к существенному уменьшению производительности. Есть два популярных семейства решений этой проблемы, которые снижают количество блокировок:
* [[Журнализацияжурнализация изменений]] (write ahead logging, WAL) ;
* [[механизм теневых страниц]] (shadow paging)<ref>[http://zeus.sai.msu.ru:7000/database/articles/aries/ Семейство алгоритмов ARIES<!-- Заголовок добавлен ботом -->]</ref>.
В обоих случаях блокировки должны быть расставлены на всю информацию, которая обновляется. В зависимости от уровня изоляции и [[имплементация|имплементации]], блокировки записи также расставляются на информацию, которая была прочитана транзакцией.
 
При ''упреждающей журнализации'', используемой в [[Sybase]] и [[MS SQL Server]] до версии 2005, все изменения записываются в журнал, и только после успешного завершения — в базу данных. Это позволяет СУБД вернуться в рабочее состояние после неожиданного падения системы. ''Теневые страницы'' содержат копии тех страниц базы данных на начало транзакции, в которых происходят изменения. Эти копии активизируются после успешного завершения. Хотя теневые страницы легче реализуются, упреждающая журнализация более эффективна<ref> Gray, J., McJones, P., Blasgen, M., Lindsay, B., Lorie, R., Price, T., Putzolu, F., and Traiger, I. The recovery manager of the System R database manager. ACM Comput. Surv. 13, 2 (June 1981).</ref>.
 
Дальнейшее развитие технологий управления базами данных привело к появлению безблокировочных технологий. Идея контроля над параллельным доступом с помощью временных меток (timestamp-based concurrency control) была развита и привела к появлению многоверсионной архитектуры [[MVCC]]. Эти технологии не нуждаются ни в журнализации изменений, ни в теневых страницах. Архитектура, реализованная в [[Oracle (СУБД)|Oracle]] 7.х и выше, записывает ''старые'' версии страниц в специальный сегмент отката, но они все ещё доступны для чтения. Если транзакция при чтении попадает на страницу, временная метка которой новее начала чтения, данные берутся из сегмента отката (то есть используется «старая» версия). Для поддержки такой работы ведётся журнал транзакций, но в отличие от «упреждающей журнализации», он не содержит данных. Работа с ним состоит из трёх логических шагов: