MySQL: управление конкурентным доступом с помощью многоверсионности

Большинство транзакционных подсистем хранения в MySQL не используют про­стой механизм построчной блокировки. Они применяют построчную блокировку в сочетании с методикой увеличения конкурентности, известной как управление конкурентным доступом с помощью многоверсионности (multiversion concurrency control, MVCC). Нельзя сказать, что методика MVCC присуща исключительно MySQL — она используется также в Oracle, PostgreSQL и некоторых других СУБД, хотя из-за отсутствия стандарта возможны существенные различия в их работе.

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

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

Каждая подсистема хранения реализует MVCC по-своему. В некоторых вариантах применяется оптимистическое и пессимистическое управление конкурентным досту­пом. Мы проиллюстрируем один из способов работы MVCC, объяснив упрощенную версию поведения InnoDB.

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

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

MVCC работает только на уровнях изолированности REPEATABLE READ и READ COMMITTED. Уровень READ UNCOMMITTED несовместим c MVCC, поскольку запросы не считывают версию строки, соответствующую их версии транзакции. Несмотря ни на что они читают самую последнюю версию. Уровень SERIALIZABLE несовместим с MVCC, по­скольку операции чтения блокируют каждую возвращаемую строку.

 

Вас заинтересует / Intresting for you:

MySQL: специфические движки дл...
MySQL: специфические движки дл... 1939 просмотров Ирина Светлова Mon, 07 Jan 2019, 12:57:57
Как создать учетную запись пол...
Как создать учетную запись пол... 2238 просмотров Валерий Павлюков Tue, 26 Jan 2021, 12:19:26
Оператор SELECT в MySQL 8: пол...
Оператор SELECT в MySQL 8: пол... 7314 просмотров Дэйзи ак-Макарова Sat, 07 Aug 2021, 10:47:45
Профилирование запросов MySQL ...
Профилирование запросов MySQL ... 7725 просмотров Светлана Комарова Sat, 02 Feb 2019, 14:25:04
Печать
Войдите чтобы комментировать