Тупик — это явление, когда две или более транзакций ожидают друг друга из-за конкуренции за ресурсы во время выполнения. Каждая транзакция удерживает ресурс и ожидает получения ресурса, уже занятого другой транзакцией, создавая циклическую ситуацию ожидания. Ни одно из этих дел не будет решено без вмешательства извне.
Взаимная блокировка может возникнуть, когда несколько транзакций пытаются одновременно изменить одну и ту же строку данных. Например, транзакция A блокирует строку в таблице для изменения, а транзакция B также пытается изменить эту строку. Если транзакция B запрашивает блокировку до фиксации транзакции A, а транзакция A также пытается получить доступ к ресурсу, который заблокировала транзакция B, может возникнуть взаимоблокировка.
В MySQL блокировки можно разделить на общие блокировки (блокировки чтения) и монопольные блокировки (блокировки записи). Когда транзакция удерживает общую блокировку и пытается перейти на исключительную блокировку, она может конфликтовать с другой транзакцией, удерживающей общую блокировку, что приводит к взаимоблокировке.
Если порядок выполнения транзакций неправильный, это также может привести к взаимоблокировке. Например, транзакция A и транзакция B блокируют разные ресурсы соответственно и пытаются получить ресурсы, заблокированные другой стороной.
Длительные транзакции могут удерживать блокировки в течение длительного времени, что увеличивает вероятность конфликтов с другими транзакциями. Кроме того, использование более высокого уровня изоляции (например, повторяемого чтения) также может увеличить риск взаимоблокировки, поскольку высокий уровень изоляции означает, что транзакции будут удерживать больше блокировок и удерживать их дольше.
MySQL запишет информацию, связанную с взаимоблокировкой, в журнал ошибок. Просматривая журнал ошибок, вы можете узнать время возникновения взаимоблокировки, задействованные транзакции и заблокированные ресурсы.
SHOW ENGINE INNODB STATUS
ЗаказЭта команда предоставляет подробную информацию о механизме хранения InnoDB, включая обнаружение взаимоблокировок. В выводе этой команды вы можете найти подробную информацию, связанную с взаимоблокировкой, например список взаимоблокирующих транзакций, ожидающие блокировки и т. д.
Используйте инструменты мониторинга производительности (такие как Percona Toolkit, MySQL Enterprise Monitor и т. д.) для мониторинга показателей производительности базы данных в режиме реального времени, включая частоту и продолжительность взаимоблокировок. Эти инструменты обычно предоставляют визуальные интерфейсы и функции оповещения, помогающие администраторам своевременно обнаруживать и решать проблемы тупиковой ситуации.
Описание сцены
Две транзакции пытаются обновить одну и ту же строку данных.
Порядок выполнения транзакции
users
серединаid=1
Цель,Но оно не было представлено.users
серединаid=1
Цель,но заблокирован,потому что Транзакция Ауже Замок Забронировал поездку。orders
середина Принадлежит пользователю1заказ,Но строку заменили на Транзакцию БЗамок Конечно(гипотеза Транзакция БДоуже Замок Конечнострока заказа)。пример SQL
-- Транзакция А
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поверхность
Описание сцены
Транзакция удерживает общую блокировку и пытается перейти на исключительную блокировку.
Порядок выполнения транзакции
products
серединаid=1
информация о продукте(Используйте общий доступ Замок)。пример SQL
-- Транзакция А
START TRANSACTION;
SELECT * FROM products WHERE id = 1 LOCK IN SHARE MODE; -- Получить Поделиться Замок
-- Попробуйте обновить позже
-- Транзакция Б
START TRANSACTION;
SELECT * FROM products WHERE id = 1 LOCK IN SHARE MODE; -- Получить Поделиться Замок
-- Попробуйте обновить позже
Описание сцены
Две транзакции блокируют разные ресурсы соответственно, но запрашивают ресурсы в противоположном порядке.
Порядок выполнения транзакции
accounts
серединаaccount_no=1001
Цель。accounts
серединаaccount_no=1002
Цель。account_no=1002
Цель,но был Транзакция БЗамок Конечно。account_no=1001
Цель,но был Транзакция АЗамок Конечно。пример SQL
-- Транзакция А
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 позже.
Описание сцены
Длинная транзакция удерживает блокировку в течение длительного времени, конфликтуя с другими транзакциями на высоких уровнях изоляции.
Порядок выполнения транзакции
inventory
серединаиз某些行。inventory
серединаиз其他行。пример SQL
Операторы SQL в этом случае аналогичны другим случаям, но дело в том, что время выполнения транзакции А очень велико, что может быть связано со сложной бизнес-логикой, внешними системными вызовами или искусственными паузами. При высоком уровне изоляции (например, повторяемом чтении) транзакция B с большей вероятностью будет затронута транзакцией A и приведет к взаимоблокировке.
Если транзакция завершается неудачей из-за взаимоблокировки, транзакцию можно просто повторить. Зачастую это простое и эффективное решение, особенно в случае спорадических взаимоблокировок.
Установив соответствующий тайм-аут блокировки, можно автоматически откатить транзакцию, если транзакция ожидает блокировки слишком долго, тем самым избегая возникновения взаимоблокировок. Однако следует отметить, что слишком короткий тайм-аут может привести к частым откатам транзакций и повторным попыткам, что повлияет на производительность системы.
Выберите подходящий уровень изоляции в зависимости от реальных потребностей. Например, использование уровня изоляции READ COMMITTED может снизить риск взаимоблокировки, когда фантомное чтение допустимо. Но имейте в виду, что снижение уровня изоляции может привести к появлению других проблем с параллелизмом.
Создайте полный механизм мониторинга и оповещения для своевременного обнаружения и устранения проблем тупиковой ситуации. Регулярно анализируя журналы взаимоблокировок и данные мониторинга производительности, мы можем выяснить закономерности и причины взаимоблокировок и сформулировать соответствующие стратегии оптимизации.
Взаимная блокировка — важная проблема в управлении параллелизмом баз данных, которая требует от администраторов и разработчиков внимания и совместного решения. Глубоко понимая причины взаимоблокировок, овладевая эффективными методами обнаружения и формулируя разумные решения, можно свести к минимуму влияние взаимоблокировок на производительность и стабильность системы. При решении проблем тупиковой ситуации для достижения оптимальной производительности системы и безопасности данных необходимо всесторонне учитывать множество аспектов, таких как параллелизм транзакций, изоляция, согласованность и надежность.
Навыки обновляются благодаря обмену ими, и каждый раз, когда я получаю новые знания, мое сердце переполняется радостью. Искренне приглашаем вас подписаться на публичный аккаунт 『
код тридцать пять
』 , для получения дополнительной технической информации.