Многоверсионный контроль параллелизма - Multiversion concurrency control

Многоверсионный контроль параллелизма (MCC или же MVCC), это контроль параллелизма метод, обычно используемый системы управления базами данных для обеспечения одновременного доступа к базе данных и в языках программирования для реализации транзакционная память.[1]

Описание

Без контроля параллелизма, если кто-то читает из базы данных одновременно с записью в нее, возможно, что читатель увидит наполовину написанный или непоследовательный фрагмент данных. Например, при совершении банковского перевода между двумя банковскими счетами, если читатель считывает баланс в банке, когда деньги были сняты с исходного счета и до того, как они были внесены на целевой счет, может показаться, что деньги исчезли из банк. Изоляция - это свойство, обеспечивающее гарантии одновременного доступа к данным. Изоляция осуществляется с помощью контроль параллелизма протокол. Самый простой способ - заставить всех читателей ждать, пока писатель не закончит, что известно как чтение-запись. замок. Известно, что блокировки создают конкуренцию, особенно между транзакциями длительного чтения и транзакциями обновления. MVCC стремится решить проблему, сохраняя несколько копий каждого элемента данных. Таким образом, каждый пользователь, подключенный к базе данных, видит снимок базы данных в определенный момент времени. Любые изменения, сделанные автором, не будут видны другим пользователям базы данных до тех пор, пока изменения не будут завершены (или, в терминах базы данных: пока сделка было совершено.)

Когда базе данных MVCC необходимо обновить часть данных, она не будет перезаписывать исходный элемент данных новыми данными, а вместо этого создает более новую версию элемента данных. Таким образом, сохраняется несколько версий. Версия, которую видит каждая транзакция, зависит от реализованного уровня изоляции. Наиболее распространенный уровень изоляции, реализованный с помощью MVCC, - это изоляция моментального снимка. С изоляцией моментального снимка транзакция наблюдает за состоянием данных, как когда транзакция началась.

MVCC предоставляет на определенный момент времени согласованный взгляды. В транзакциях чтения в MVCC обычно используется метка времени или идентификатор транзакции, чтобы определить, какое состояние БД читать, и прочитать эти версии данных. Таким образом, транзакции чтения и записи изолированные друг от друга без необходимости блокировки. Однако, несмотря на то, что блокировки не нужны, они используются некоторыми базами данных MVCC, такими как Oracle. Запись создает новую версию, а одновременное чтение обеспечивает доступ к более старой версии.

MVCC представляет проблему, как удалить версии, которые стали устаревшими и никогда не будут прочитаны. В некоторых случаях реализован процесс периодического просмотра и удаления устаревших версий. Часто это временный процесс, который проходит по всей таблице и перезаписывает ее последней версией каждого элемента данных. PostgreSQL применяет этот подход в процессе ВАКУУМ. Другие базы данных разделяют блоки хранения на две части: часть данных и журнал отмены. В части данных всегда сохраняется последняя зафиксированная версия. Журнал отмены позволяет воссоздать старые версии данных. Основное неотъемлемое ограничение этого последнего подхода заключается в том, что при наличии рабочих нагрузок с интенсивным обновлением в части журнала отмены не хватает места, а затем транзакции прерываются, поскольку им не может быть предоставлен их моментальный снимок. Для документно-ориентированная база данных он также позволяет системе оптимизировать документы путем записи целых документов на смежные разделы диска - при обновлении можно переписать весь документ, а не вырезать отдельные фрагменты или сохранять в связанной, несмежной структуре базы данных.

Выполнение

MVCC использует отметки времени (TS), и увеличение идентификаторов транзакций, достигать транзакционная согласованность. MVCC обеспечивает транзакцию (Т) никогда не придется ждать Читать объект базы данных (п), поддерживая несколько версий объекта. Каждая версия объекта п имеет как Читать метку времени (РТС) и Написать метку времени (WTS), что позволяет конкретной транзакции Тя прочитать самую последнюю версию объекта, которая предшествует транзакции Читать метку времени РТС(Тя).

Если сделка Тя хотеть Написать для объекта п, а также есть еще одна транзакция Тk происходит с тем же объектом, метка времени чтения РТС(Тя) должен предшествовать метке времени чтения РТС(Тk), т.е. РТС(Тя) < РТС(Тk)[требуется разъяснение ], для объекта Запись операции (WTS) преуспеть. А Написать не может завершиться, если есть другие невыполненные транзакции с более ранней отметкой времени чтения (РТС) к тому же объекту. Подобно тому, как стоять в очереди в магазине, вы не можете завершить свою транзакцию, пока те, кто перед вами, не завершат свою.

Чтобы повторить; каждый объект (п) имеет Отметка времени (TS), однако если транзакция Тя хотеть Написать к объекту, и транзакция имеет Отметка времени (TS), который предшествует текущей отметке времени чтения объекта, TS(Тя) < РТС(п), то транзакция прерывается и перезапускается. (Это потому, что более поздняя транзакция уже зависит от старого значения.) В противном случае, Тя создает новую версию объекта п и устанавливает отметку времени чтения / записи TS новой версии к отметке времени транзакции TSTS(Тя).[2]

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

Примеры

Параллельное чтение-запись

При Time = 1 состояние базы данных может быть:

ВремяОбъект 1Объект 2
0"Фу" от T0"Бар" Т0
1"Привет" от Т1

T0 написал Object 1 = "Foo" и Object 2 = "Bar". После этого T1 написал Object 1 = "Hello", оставив объекту 2 его исходное значение. Новое значение Объекта 1 заменит значение 0 для всех транзакций, которые начинаются после фиксации T1, после чего версия 0 объекта 1 может быть удалена сборщиком мусора.

Если длительная транзакция T2 запускает операцию чтения объекта 2 и объекта 1 после подтверждения T1 и существует одновременная транзакция обновления T3, которая удаляет объект 2 и добавляет объект 3 = "Foo-Bar", состояние базы данных будет выглядеть так, как в момент времени 2:

ВремяОбъект 1Объект 2Объект 3
0"Фу" от T0"Бар" Т0
1"Привет" от Т1
2(удален) T3«Фу-Бар» от Т3

На момент 2 появилась новая версия объекта 2, которая помечена как удаленная, и новая версия объекта 3. Поскольку T2 и T3 выполняются одновременно, T2 видит версию базы данных до 2, то есть до того, как T3 зафиксировал запись, как таковой T2 читает объект 2 = «Бар» и Объект 1 = «Привет». Таким образом, мультиверсионный контроль параллелизма позволяет выполнять чтение с изоляцией моментальных снимков без каких-либо блокировок.

История

Управление параллелизмом нескольких версий подробно описано в статье 1981 г. «Управление параллелизмом в системах распределенных баз данных».[3] к Фил Бернштейн и Натан Гудман, тогда работавший в Компьютерная корпорация Америки. В статье Бернштейна и Гудмана цитируется диссертация 1978 года.[4] к Дэвид П. Рид который довольно четко описывает MVCC и утверждает, что это оригинальная работа.

Первый коммерческий программный продукт для баз данных с MVCC был VAX Rdb / ELN, создано на Корпорация цифрового оборудования к Джим Старки. Старки создал вторую коммерчески успешную базу данных MVCC - InterBase.[5]

Смотрите также

Рекомендации

  1. ^ "Clojure - ссылки и транзакции". clojure.org. Получено 2019-04-12.
  2. ^ Рамакришнан, Р., и Герке, Дж. (2000). Системы управления базами данных. Осборн / Макгроу-Хилл.
  3. ^ Бернштейн, Филип А.; Гудман, Натан (1981). «Управление параллелизмом в системах распределенных баз данных». Опросы ACM Computing.
  4. ^ Рид, Дэвид П. (21 сентября 1978 г.). «Именование и синхронизация в децентрализованной компьютерной системе». Диссертация Массачусетского технологического института. Архивировано из оригинал 25 октября 2005 г.. Получено 18 февраля, 2006.
  5. ^ «Не очень техническое обсуждение мультиверсионного управления параллелизмом». firebirdsql.org. Получено 2020-11-12.

дальнейшее чтение

  • Герхард Вейкум, Готфрид Фоссен, Транзакционные информационные системы: теория, алгоритмы и практика управления параллелизмом и восстановления, Морган Кауфманн, 2002 г., ISBN  1-55860-508-8