Одновременность MySQL: блокировки и транзакции для разработчиков и DBA MySQL
Copyright © 2021 Джеспер Висборг Крог
![]() |
Данный документ предоставляется по лицензии Creative Commons Attribution 3.0 License, за исключением разделов со специальными оговорками. |
Первая публикация на английском языке: 23 Января 2021
Опубликовано Apress, Berkeley, CA
North Richland Hills, TX, USA
ISBN 978-1-4842-6651-9
eBook ISBN 978-1-4842-6652-6
https://doi.org/10.1007/978-1-4842-6652-6
2021-01-23
- Автор
- Джеспер Висборг Крог
- Директор- распорядитель, Apress Media LLC
- Велмоуид Спахр
- Редактор приобретения
- Джонатан Генник
- Редактор по разработке
- Лаура Вирендсон
- Координирующий редактор
- Джил Больцано
- Разработка обложки
- Freepik
- www.freepik.com
Моей жене, Анне- Маргарите - Спасибо за участие и поддержку.

Джеспер Висборг Крог работал с базами данных MySQL начиная с 2006 и как разработчик, и как администратор базы данных, а на протяжении более чем 8 лет как часть Команды поддержки Oracle MySQL. В настоящее время он работает в качестве инженера по надёжности баз данных для Okta. Он выступает на MySQL Connect, Oracle OpenWorld и Oracle Developer Live во многих случаях. Дополнительно к своим книгам Джеспер постоянно ведёт блоги по темам MySQL и является автором более чем 800 документов в Oracle Knowledge Base. Он внёс свой вклад в схему sys и в четыре экзамена Oracle Certified Professional (OCP) для MySQL 5.6–8. Джеспер обладает степенью доктора философии в вычислительной химии; проживает в Сиднее, Австралия; получает удовольствие от проведения времени в прогулках вне дома, путешествиях и от чтения. Его экспертные области включают в себя MySQL Cluster, MySQL Enterprise Backup (MEB), настройку производительности, а также схемы производительности и sys.

Чарльз Белл проводит исследования в области новейших технологий. Он является участником команды разработчиков Oracle MySQL и старшим разработчиком для команды Корпоративного резервного копирования MySQL. Он живёт в небольшом городке в сельской местности в Вирджинии со своей любящей супругой. Он получил степень доктора философии в области инженерии в Университете Содружества Вирджинии в 2005.
Чарльз является экспертом в области баз данных и обладает обширными познаниями в разработке программного обеспечения и системной инженерии. Его исследовательские интересы включают в себя 3D печать, микроконтроллеры, системы с высокой доступностью, облачные решения и сенсорные сети. Своё ограниченное свободное время он проводит как практикующий Творец, уделяя особое внимание проектам микроконтроллеров и улучшения трёхмерных принтеров.
Прежде всего, я бы хотел поблагодарить всех тех из команды Appress, кто сделал возможной эту книгу. В частности, я бы хотел поблагодарить Джонатана Генника, который придумал саму идею, Джилл Бальцано, которая координировала эту работу, Лауру Берендсон за её закулисную работу и Креапзилин Рома за то, что она уловила лингвистические ошибки.
Те знания, которыми мы поделились в этой книге возникли не на пустом месте. Благодарю Чарльза Белла за предоставление - как всегда - тщательного обзора с конструктивными отзывами и предложения улучшений. Якуб Лопушанский был полезен подробностями блокировок InnoDB. Я бы также хотел поблагодарить всех своих колег, которые на протяжении многих лет, через их наставничество, были частью моего путешествия по изучению того как работает MySQL, обучая меня, задавая мне хорошие вопросы, а также через общие рассуждения. Особая благодарность за их помощь Эдвину Десуза и Фре́де́рику Декампу (более известному как Лефред).
И последнее, но не менее важное: спасибо моей жене Анн-Маргарите за её терпение и поддержку при написании этой книги. Без тебя было бы невозможно написать эту книгу.
При работе с базами данных блокировки и транзакции это что-то из наиболее сложных и непонятных тем. Эта книга имеет целью улучшение понимания вами этих двух понятий, того как они работают, как вы можете исследовать их и как вы можете улучшать свои рабочие нагрузки с тем чтобы лучше работать с ними. Это достигается через сочетание обсуждения мониторинга, теории блокировок и транзакций, а также последовательности вариантов применения.
MySQL знаменит поддержкой своих механизмов хранения. Тем не менее, эта книга обсуждает исключительно механизм хранения InnoDB и рассматривает только MySQL 8. Тем не менее, большая часть этих обсуждений также применима и к более старым версиям MySQL и в целом именно это и упоминается когда некая функциональная возможность является новой в MySQL 8, или когда MySQL 8 имеет поведение, отличается по сравнению с более старыми версиями.
Эта книга была написана для разработчиков и администраторов базы данных, которые обладают опытом работы с MySQL и хотели бы расширить свои познания относительно того как работают блокировки и транзакции в царстве одновременности MySQL.
Я попытался добавить настолько много примеров и выводов из них как только это возможно. Некоторые из примеров достаточно кратки, а некоторые весьма длинные. В любом случае, я надеюсь что вы сможете проследить за ними и воспроизвести их действие или продемонстрированный результат. В то же самое время имейте в виду, что по самой своей природе зачастую присутствует случайность и точный вывод этих примеров может зависеть от того как для этого примера применялись таблицы и данные. Иначе говоря, вы можете получить другие результаты даже когда вы всё сделали верно. В особенности это применимо к числам, которые связаны с идентификаторами блокировок, расположению памяти, взаимным блокировкам/ семафорам, временам и тому подобному.
В репозитории GitHub этой книги были добавлены длинные примеры, либо те, что производят длинный или обширный вывод. Здесь также содержатся рисунки, которые могут оказаться трудными для прочтения по причине того размера рисунка, который позволяет формат печатной страницы.
![]() | Замечание |
---|---|
Саму ссылку на этот репозиторий можно обнаружить на домашней странице книги. Её также можно отыскать непосредственно на GitHub. |
В GitHub репозиторий этой книги также был включён написанный на Python модуль для его применения в Оболочке MySQL для упрощения воспроизведения всех примеров и предоставления образцов запросов, который можно применять для изучения той задачи, которую демонстрирует конкретный тест. Базовая установка и инструкции по использованию приводятся в Главе 1 и документированы полностью в Дополнении B.
GitHub также станет пристанищем для всех ошибок в этой книге после её создания. Я буду пользоваться этими перечнем ошибок не только для сообщения об ошибках в самой книге, но также для предоставления обновлений при исправлении ошибок и новых функциональных возможностях MySQL 8, приводящих к изменениям в содержимом книги. Когда это потребуется, я также обновлю сами примеры в этом репозитории чтобы отражать изменения поведения в более новых выпусках. По этим причинам я рекомендую вам следить за данным репозиторием.
Чтобы вы могли применять эту книгу в качестве справочника, я попытался оставлять каждую из глав относительно самостоятельной. Недостатком такого выбора является то, что время от времени происходит дублирование сведений. Это особенно очевидно в вариантах использования, которые повторяют некоторые сведения, обсуждавшиеся в более ранних главах. Это было осознанным выбором и я надеюсь, что это поспособствует уменьшению вами пролистывания страниц в поиске требующихся вам сведений.
Книга подразделяется на восемнадцать глав и два Дополнения. Глава 1 предоставляет некое введение. Главы 2 - 4 охватывают мониторинг блокировок и транзакций. Главы 5 - 10 обсуждают блокировки. Главы 11 - 12содержат сведения о транзакциях, а заключительные Главы 13 - 18 проходят через шесть вариантов применения. Дополнения содержат справочные сведения относительно мониторинга блокировок и транзакций, а также о предоставляемого в этой книге модуля Оболочки MySQL.
-
Глава 1, Введение: Эта вводная глава охватывает некоторые положения верхнего уровня, а также служит введением в модуль Оболочки MySQL для воспроизведения тех примеров и проверочных данных, которые имеются в этой книге.
-
Глава 2, Мониторинг блокировок и взаимных исключений: Данная глава покрывает то как вы можете отслеживать блокировки при помощи схемы Производительности, схемы sys, счётчиков состояния и метрик InnoDB. Также имеются сведения относительно того как пользоваться монитором блокировок InnoDB и сведениями о взаимных блокировках в мониторе InoD, а также как получать сведения относительно состязательности взаимных исключений и семафоров.
-
Глава 3, Мониторинг транзакций InnoDB: Эта глава в первую очередь показывает как вы можете пользоваться представлением
information_schema.INNODB_TRX
для расследования транзакций InnoDB. Также обсуждаются собственно список транзакций в мониторе InnoDB и связанные с транзакциями метрики InnoDB. -
Глава 4, Транзакции в схеме Производительности: Данная глава продолжает с того места, на котором завершилась предыдущая, проходя через сведения о конкретной транзакции в Схеме Производительности и то как вы можете отыскивать соответствующие операторы для некой транзакции.
-
Глава 5, Уровни блокировок доступа: Эта глава следует через совместные, исключительные блокировки и блокировки намерений, а также показывает какие из них совместимы друг с другом.
-
Глава 6, Типы блокировок верхнего уровня: В отой главе рассматриваются те блокировки, которые работают на более высоком уровне нежели записи. В основном это блокировки, обрабатываемые вне сферы действия самих механизмов хранения и содержат блокировки уровня пользователя, блокировки метаданных, сбрасывающих блокировок и блокировки уровня таблиц. Также включены новые для MySQL 8 блокировки резервного копирования и журналирования.
-
Глава 7, Блокировки InnoDB: Данная глава следует применяемыми InnoDB блокировками записей. Они включают в свой состав блокировки простых записей, блокировки промежутка, блокировки предикатов, блокировки намерений вставки, а также взаимные исключения и семафоры блокировок RW.
-
Глава 8, Работа с конфликтами блокировок: В этой главе поясняется что происходит когда случается конфликт блокировок на примере обсуждения CATS (планирования транзакций осведомлённых о состязательности), применяемых внутри блокировок с приоритетами и обсуждения совместимости блокировок для таймаутов ожидания блокирования и взаимного блокирования.
-
Глава 9, Снижение проблем блокираний: Данная глава обсуждает как можно снижать состязательность блокировок и собственно воздействие состязательности в вашей системе. Методы включают снижение размера и возраста самих транзакций при помощи индексации, доступа к записям в том же самом порядке для одновременных задач, изменения значения уровня изоляции транзакции и прочего.
-
Глава 10, Индексы и внешние ключи: Эта глава подробно рассматривает воздействие индексации и внешних ключей на блокирование. Требуют ли уникальные индексы меньше блокировок по сравнению с не уникальной индексацией? Действительно ли внешние ключи вызывают большее число блокировок? Ответом является да, а данная глава почему это имеет место и предоставляет примеры имеющихся отличий.
-
Глава 11, Транзакции: В этой главе обсуждается то, чем являются транзакции и как они способствуют обработке одновременных рабочих потоков. Данная глава также охватывает собственно воздействие транзакцию и то как функциональная возможность групповой фиксации способствует снижению влияния продолжающихся транзакций фиксации.
-
Глава 12, Уровни изоляции транзакции: Данная глава проходит через поддерживаемых InnoDB четыре уровня изоляции транзакций посредством обсуждения того как каждый уровень воздействует на блокирование и согласованность данных.
-
Глава 13, Пример использования: блокировки сброса: В этой главе устанавливается определённая база данных, а потому возникает состязательность блокировки сброса, а затем она следует через анализ данной проблемы и предоставление некого решения с обсуждением того как предотвращать такую проблему.
-
Глава 14, Пример использования: блокировки метаданных и схемы: В данной главе рассматривается ещё одна распространённая проблема блокировки на примере изучения ситуации с блокированием метаданных.
-
Глава 15, Пример использования: блокировки уровня записи: Эта глава предпринимает некое расследование в блокировках уровня записи InnoDB и обсуждает как разрешить такую проблему блокировки и снижать вероятность встречи с ней.
-
Глава 16, Пример использования: взаимные блокировки: Данная глава следует расследованию взаимной блокировки при помощи подробностей анализа конкретных сведений относительно взаимной блокировки из вывода монитора InnoDB.
-
Глава 17, Пример использования: внешние ключи: В этой главе охватывается сценарий некой расширенной блокировки, вызываемой внешними ключами, включая и блокировки метаданных и блокировки записей InnoDB.
-
Глава 18, Пример использования: семафоры: Данная глава настраивает некий вариант проверки включения состязательности семафоров и осуществляет расследование этой проблемы.
-
Дополнение A: Справочные сведения: Это Дополнение предоставляет некий обзор ресурсов для поиска сведений, относящихся к обсуждаемым в этой книге темам. Эти ресурсы в первую очередь состоят из таблиц в Схеме Производительности и представлений в схеме
sys
, включая все возможные значения в столбцахOBJECT_TYPE
иLOCK_TYPE
таблицыperformance_schema.metadata_locks
. Включены также некоторые ресурсы Информационной Схемы, а также имеется список разделов в конкретном вывода из монитора InnoDB. -
Дополнение B: Модуль оболочки MySQL: Данное Дополнение является справочными сведениями для модуля Python, включённого в эту книгу. Оно содержит обсуждение того как устанавливать и применять такой модуль, а также как организован его код на тот случай, если вы пожелаете расширить его на свои собственные рабочие потоки.
- О книге
- Глава 1. Введение
- Глава 2. Мониторинг блокировок и взаимных исключений
- Глава 3. Мониторинг транзакций InnoDB
- Глава 4. Транзакции в схеме Производительности
- Глава 5. Уровни блокировок доступа
- Глава 6. Типы блокировок верхнего уровня
- Глава 7. Блокировки InnoDB
- Глава 8. Работа с конфликтами блокировок
- Глава 9. Снижение проблем блокирований
- Глава 10. Индексы и внешние ключи
- Глава 11. Транзакции
- Глава 12. Уровни изоляции транзакции
- Глава 13. Пример использования: блокировки сброса
- Глава 14. Пример использования: блокировки метаданных и схемы
- Глава 15. Пример использования: блокировки уровня записи
- Глава 16. Пример использования: взаимные блокировки
- Глава 17. Пример использования: внешние ключи
- Глава 18. Пример использования: семафоры
- Дополнение A: Справочные сведения
- Дополнение B: Модуль оболочки MySQL
- Указатель