Интервью Pop: В чем разница между MVCC и гэп-локами?

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

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

Определение MVCC

MVCC — это аббревиатура от Multi-Version Concurrency Control (управление многоверсионным параллелизмом), который представляет собой метод управления параллелизмом.

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

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

В MySQL механизм хранения InnoDB использует MVCC для реализации управления параллелизмом.

определение гэп-блокировки

Блокировка промежутка — это блокировка, которая блокирует диапазон индекса вместо фактических данных. Она может блокировать диапазон, чтобы другие транзакции не могли вставлять данные в этот диапазон, тем самым обеспечивая уникальность данных в диапазоне. В MySQL механизм хранения InnoDB поддерживает блокировки пробелов. Механизм хранения InnoDB автоматически использует блокировки пробелов для блокировки диапазонов индексов при использовании операторов SELECT ... FOR UPDATE или SELECT ... LOCK IN SHARE MODE.

Если транзакция удерживает блокировку пробела, другие транзакции не могут вставлять данные в пробел, но могут вставлять данные до или после пробела.

Зачем нужен MVCC?

Зачем нужен MVCC, когда уже есть блокировки для предотвращения параллельного доступа? Рождение MVCC в основном связано с соображениями производительности, поскольку MVCC не использует блокировки и использует управление параллелизмом с несколькими версиями для обеспечения одновременного доступа к базе данных, что намного лучше, чем производительность при блокировке.

Принцип реализации MVCC

MVCC настолько силен, как это стало реальностью? Проще говоря, MVCC реализуется с помощью следующих трех основных компонентов:

  1. Скрытые поля: Каждая выполняемая SQL-команда имеет несколько скрытых полей, среди которых есть поле идентификатора транзакции, что очень важно.
  2. журнал отмены (журнал отката): записывает исторические данные выполнения команды SQL.
  3. Read View (представление для чтения): Содержит прочитанный снимок (снимок, сохраняющий данные в определенный момент в базе данных) и некоторые важные атрибуты.

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

Может ли MVCC разрешить фантомное чтение?

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

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

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

То есть, если вы хотите полностью решить проблему фантомного чтения на уровне изоляции транзакций RR (REPEATABLE READ) в MySQL InnoDB, вам нужно использовать механизм блокировки MVCC + для достижения этого вместе.

Классификация замков

Механизм блокировки в MySQL InnoDB включает в себя не только гэп-блокировки, но также блокировки строк и временные блокировки.

В чем разница между блокировками строк, блокировками пробелов и блокировками временных конструкций?

Блокировки строк, блокировки промежутков и временные блокировки — все это механизмы блокировки в MySQL, их отличия заключаются в следующем:

  • Блокировка строки — это блокировка строки данных, которая предотвращает изменение строки данных другими транзакциями.
  • Гэп-блокировка — это блокировка определенного диапазона данных, которая предотвращает вставку данных в этот диапазон другими транзакциями.
  • Временная блокировка представляет собой комбинацию блокировки строки и блокировки гэпа.Его можно понимать как специальную блокировку гэпа, которая равна блокировке строки + блокировка гэпа.Помимо блокировки самой записи, она также блокирует гэп между индексами, то есть блокирует участок левого открытого правого диапазона закрытых индексов.

краткое содержание

MVCC и механизм блокировки решают проблему фантомного чтения уровня изоляции транзакций RR в MySQL InnoDB, и в MySQL существует множество типов блокировок, таких как блокировки строк, блокировки пробелов, временные блокировки и т. д.

Guess you like

Origin blog.csdn.net/weixin_42232156/article/details/129934521
Recommended