Привет, хабр.
Меня зовут Владислав Родин.
В настоящее время я являюсь руководителем курса High Workload Architect в OTUS, а также преподаю курсы по архитектуре программного обеспечения.
Специально к началу набора на новый курс «Архитектор высоких нагрузок» Я написал небольшой материал, которым рад с вами поделиться.
Введение
Последний раз Мы говорили с вами о последствиях ослабления изоляции транзакций в базах данных.Сегодня мы более подробно обсудим один из способов обеспечить эту самую изоляцию и избежать рассмотренных аномалий.
Как вы могли заметить, в прошлой статье часто выделялись два подхода: один основывался на том факте, что записи имеют некоторые версии , а второе - мы так или иначе будем записывать блокировать .
Таким образом, выделяют два класса баз данных: Версионеры и блокировщики .
Сегодня мы поговорим о том, что такое версионеры, а рассмотрение блокировщиков оставим на следующий раз.
Версионисты
Как я уже говорил, один из подходов основан на версионировании.Его также называют оптимистичный подход или MVCC (управление многоверсионным параллелизмом) .
Фактически сохраняются версии для активных транзакций.
Где хранятся версии?
Реализация механизма зависит от базы данных.Я приведу примеры некоторых из них.
PostgreSQL
Каждая транзакция характеризуется определенным идентификатором.Идентификаторы транзакций монотонно растут. Любая строка имеет 2 атрибута, которые представляют метаинформацию для обеспечения механизма: update_by_id — идентификатор транзакции, которая последней обновила эту запись, и delete_by_id — идентификатор транзакции, которая удалила эту запись.
Когда поступает новая транзакция, база данных определяет идентификаторы выполняющихся в данный момент транзакций; изменения, внесенные этими транзакциями, будут игнорироваться во входящей транзакции.
Получается, что входящая транзакция работает как бы со своей версией данных.
Старые версии данных хранятся там же, где и текущие.
Если приходит Update, то добавляется еще одна строка и эта запись становится активной.
Также понятно, что для корректной работы этой схемы необходим «сборщик мусора»: если какая-то запись имеет delete_by_id = 100, а минимальный id среди выполняющихся в данный момент транзакций равен 150, то такую запись необходимо удалить.
MySQL (движок InnoDB)
В базе данных MySQL хранится только текущая версия.При поступлении Update данные внутри файла с таблицей исправляются.
После исправления данных в журнале отката сохраняется предыдущая версия.
MySQL имеет несколько журналов отката (они разные для вставок и обновлений).
Если для транзакции требуется предыдущая версия строки, система переходит к журналу отмены и восстанавливает необходимую версию.
Версия также определяется идентификатором транзакции.
Оракул
Схема аналогична MySQL: текущие версии сохраняются в файле данных, старые версии восстанавливаются благодаря журналу отмены.Журнал отмены в Oracle циклически перезаписывается.
Поэтому возможна ситуация, когда для транзакции нужна очень старая версия записи, но ее уже нет в журнале отмены.
Если такая ситуация произойдет, транзакция завершится с ошибкой.
MS SQL
MS SQL позволяет включать режимы управления версиями и блокировки.Для включения версионного режима в настройках базы данных необходимо включить работу со снапшотами.
В MS SQL есть системная таблица (tempdb), которая предназначена для хранения временных таблиц.
Для хранения старых версий используется база данных tempdb, а в таблице — текущие версии.
Системный процесс следит, чтобы в tempdb были версии, на которые никто не ссылается, их можно удалить.
Если транзакция длительная, то для нее будут сохранены версии.
Tempdb растет, достигает максимального размера, MS SQL выделяет некоторое дисковое пространство.
Если оно также заканчивается, то транзакции с изоляцией моментального снимка не могут быть выполнены.
Если используется этот режим работы, необходимо отслеживать длинные транзакции, потому что откат такой транзакции во времени может стоить столько же, сколько она работает, а может и немного больше.
Конфликты
Этот подход называется оптимистическим, поскольку мы надеемся, что при выполнении параллельных транзакций, изменяющих данные, конфликтов не возникнет. Что происходит в случае конфликта? Предположим, что транзакция Т1 изменяет 10 000 записей, а транзакция Т2 параллельно изменяет 1 запись.
Если так получится, что эта 1 запись входит в эти 10 000, то одна из транзакций будет откачена: если Т1 была завершена первой, то будет откачен Т2, иначе наоборот.
Механизм отката
Механизм отката транзакции в версионных версиях зависит от реализации.Например, в PostgreSQL транзакция помечается как откатанная, и очистка освобождает дисковое пространство.
Этот механизм работает довольно быстро.
В Oracle для выполнения отката данные восстанавливаются из журнала отмены.
В этом случае время работы увеличивается, но все равно гораздо быстрее, чем в блокировщиках.
MySQL работает так же, как Oracle.
Заключение
Оптимистический подход хорош тем, что автор не блокирует читателя, читатель просто корректирует свою версию данных.Поэтому версионирование выгодно, если основная нагрузка приходится на чтение, а не на написание (блог, отчетность и другие случаи, когда нужно много и часто читать).
Подробнее о курсе вы можете узнать здесь Теги: #архитектура #Администрирование баз данных #Высокая производительность #postgresql #Системный анализ и проектирование #postgres #Промышленное программирование #highload #sql #MySQL #oracle #log # Performance #mvcc #isolation #commit #acid #transactions #load #consistency # high #базы данных #атомарность #откат #InnoDB #isolation. долговечность #vacuum #vacuum #auto #auto #auto-vacuum #auto-vacuum #oracledb #undo #undo #mssql #mssql
-
Взгляд На Проблемы Беспроводной Сети
19 Oct, 24 -
«Сеть — Странная И Ядовитая Вещь».
19 Oct, 24 -
Выпуск Ios 4.2 Для Устройств Ios
19 Oct, 24 -
Один Провод
19 Oct, 24 -
Mpaa Уличили В Пиратстве. Снова
19 Oct, 24