Углубленный анализ тупика MySQL: причины, обнаружение и решения
Углубленный анализ тупика MySQL: причины, обнаружение и решения

Что такое тупик?

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

Причины тупика MySQL

1. Конкуренция за одни и те же ресурсы

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

2. Обновление блокировки

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

3. Неправильный порядок сделок

Если порядок выполнения транзакций неправильный, это также может привести к взаимоблокировке. Например, транзакция A и транзакция B блокируют разные ресурсы соответственно и пытаются получить ресурсы, заблокированные другой стороной.

4. Длинные транзакции и высокий уровень изоляции

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

Как обнаружить тупик MySQL?

1. Проверьте журнал ошибок.

MySQL запишет информацию, связанную с взаимоблокировкой, в журнал ошибок. Просматривая журнал ошибок, вы можете узнать время возникновения взаимоблокировки, задействованные транзакции и заблокированные ресурсы.

2. использоватьSHOW ENGINE INNODB STATUSЗаказ

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

3. Инструменты мониторинга производительности

Используйте инструменты мониторинга производительности (такие как Percona Toolkit, MySQL Enterprise Monitor и т. д.) для мониторинга показателей производительности базы данных в режиме реального времени, включая частоту и продолжительность взаимоблокировок. Эти инструменты обычно предоставляют визуальные интерфейсы и функции оповещения, помогающие администраторам своевременно обнаруживать и решать проблемы тупиковой ситуации.

Анализ случаев тупиковой ситуации MySQL

Случай 1: Конкуренция за один и тот же ресурс

Описание сцены

Две транзакции пытаются обновить одну и ту же строку данных.

Порядок выполнения транзакции

  1. Транзакция АОбновить таблицуusersсерединаid=1Цель,Но оно не было представлено.
  2. Транзакция Бтоже пробовал Обновить таблицуusersсерединаid=1Цель,но заблокирован,потому что Транзакция Ауже Замок Забронировал поездку。
  3. в то же время,Транзакция Атоже пробовал Обновить таблицуordersсередина Принадлежит пользователю1заказ,Но строку заменили на Транзакцию БЗамок Конечно(гипотеза Транзакция БДоуже Замок Конечнострока заказа)。
  4. в это время,Транзакция Аи Транзакция Подождите, пока друг друга высвободят ресурсы.,Формирование замка смерти.

пример SQL

Язык кода:javascript
копировать
-- Транзакция А
START TRANSACTION;
UPDATE users SET balance = balance - 100 WHERE id = 1; -- Замок Определить строку пользователя 1
-- Попробуйте обновить таблицу заказов позже.

-- Транзакция Б
START TRANSACTION;
UPDATE orders SET status = 'shipped' WHERE user_id = 1; -- Замок Определить строку заказа для пользователя 1
-- Попробуйте обновить позжеusersповерхность
Случай 2: Обновление блокировки

Описание сцены

Транзакция удерживает общую блокировку и пытается перейти на исключительную блокировку.

Порядок выполнения транзакции

  1. Транзакция Ачитатьповерхностьproductsсерединаid=1информация о продукте(Используйте общий доступ Замок)。
  2. Транзакция Б也читать相同информация о продукте(общий Замок Не взаимоисключающие)。
  3. Транзакция АТеперь хочу обновить информацию об этом продукте,Необходимо перейти на эксклюзивный Замок.,но был Транзакция Бизобщий Замокблокировать。
  4. в то же время,Транзакция БТакже хочу обновить информацию об этом продукте,такой же Необходимо перейти на эксклюзивный Замок.,одеяло Транзакция Аизобщий Замок(Запросите повышение до эксклюзивного уровня прямо сейчас Замок)блокировать。
  5. Образовался Мертвый Замок.

пример SQL

Язык кода:javascript
копировать
-- Транзакция А
START TRANSACTION;
SELECT * FROM products WHERE id = 1 LOCK IN SHARE MODE; -- Получить Поделиться Замок
-- Попробуйте обновить позже

-- Транзакция Б
START TRANSACTION;
SELECT * FROM products WHERE id = 1 LOCK IN SHARE MODE; -- Получить Поделиться Замок
-- Попробуйте обновить позже
Случай 3: Неправильный порядок транзакций

Описание сцены

Две транзакции блокируют разные ресурсы соответственно, но запрашивают ресурсы в противоположном порядке.

Порядок выполнения транзакции

  1. Транзакция АЗамок Конечноповерхностьaccountsсерединаaccount_no=1001Цель。
  2. Транзакция БЗамок Конечноповерхностьaccountsсерединаaccount_no=1002Цель。
  3. Транзакция Апытаюсь получить доступaccount_no=1002Цель,но был Транзакция БЗамок Конечно。
  4. Транзакция Бпытаюсь получить доступaccount_no=1001Цель,но был Транзакция АЗамок Конечно。
  5. Образовался Мертвый Замок.

пример SQL

Язык кода:javascript
копировать
-- Транзакция А
START TRANSACTION;
UPDATE accounts SET balance = balance + 50 WHERE account_no = 1001; -- Замок Определить 1001 аккаунт
-- Попробуйте получить доступ к учетной записи 1002 позже.

-- Транзакция Б
START TRANSACTION;
UPDATE accounts SET balance = balance - 50 WHERE account_no = 1002; -- Замок Определить 1002 аккаунт
-- Попробуйте войти в учетную запись 1001 позже.
Случай 4: Длинные транзакции и высокий уровень изоляции

Описание сцены

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

Порядок выполнения транзакции

  1. Транзакция Начать длинную транзакцию,и Замок Конечно Понятноповерхностьinventoryсерединаиз某些行。
  2. потому что Транзакция Срок исполнения долгий,Транзакция Б ждет Транзакцию Авыпускать Замокиз过程серединатоже началосьипытаться Замок Конечноповерхностьinventoryсерединаиз其他行。
  3. Транзакция БОжидание процессасерединаодеялоблокировать,потому чтозанимает Цельодеяло Транзакция АЗамок Конечно。
  4. в то же время,Транзакция Ав последующих операцияхсерединапытаться Замок Конечно Транзакция Буже Замок Конечно Цель,Вызывает смерть Замок.

пример SQL

Операторы SQL в этом случае аналогичны другим случаям, но дело в том, что время выполнения транзакции А очень велико, что может быть связано со сложной бизнес-логикой, внешними системными вызовами или искусственными паузами. При высоком уровне изоляции (например, повторяемом чтении) транзакция B с большей вероятностью будет затронута транзакцией A и приведет к взаимоблокировке.

Решение тупика MySQL

1. Повторите неудачные транзакции.

Если транзакция завершается неудачей из-за взаимоблокировки, транзакцию можно просто повторить. Зачастую это простое и эффективное решение, особенно в случае спорадических взаимоблокировок.

2. Оптимизация дизайна транзакции
  • Уменьшить размер транзакции:Попробуйте разделить большие транзакции на несколько более мелких транзакций.,Сократите продолжительность транзакции.
  • Фиксированный порядок доступа к ресурсам:Если все транзакции обращаются к ресурсам в одном и том же порядке,Тогда вероятность смерти значительно уменьшится.
  • Избегайте длинных транзакций:Минимизируйте время выполнения транзакции,Не занимайте Замок на длительное время.
3. Установите тайм-аут блокировки.

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

4. Отрегулируйте уровень изоляции.

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

5. Используйте стратегии предотвращения тупиковых ситуаций
  • Используйте транзакции с низким приоритетом:Установите более низкий приоритет для неважных задач.,Сделайте его предпочтительным откатом при возникновении смерти.
  • Избегайте ожидания цикла:通过合理из资源分配ибизнес-дизайн,Избегайте условий, которые создают циклическое ожидание.
6. Мониторинг и оповещение

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

Подвести итог

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


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

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose