Mysql: тупик внутри хранимой процедуры

У меня есть такая хранимая процедура:

DECLARE err_code CHAR(5) DEFAULT '00000';
DECLARE msg TEXT;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
    GET DIAGNOSTICS CONDITION 1
    err_code = RETURNED_SQLSTATE, msg = MESSAGE_TEXT;
END;

START TRANSACTION;
INSERT INTO tableA .....;
INSERT INTO tableB .....;

SELECT updateJournal(id) INTO x;

IF err_code != '00000' THEN
   ROLLBACK;
   INSERT INTO log (msg) VALUES (msg);
ELSE
   COMMIT;
END IF;
CREATE FUNCTION updateJournal(orderId INT) return int 
BEGIN INSERT INTO tableC ....; 
UPDATE tabled ....;

RETURN 1; END

иногда я получаю сообщение об ошибке «Обнаружена тупиковая ситуация при попытке получить блокировку; попробуйте перезапустить транзакцию» хранимая процедура выполняет откат, но функция updateJournal все еще работает (tableC inserted, tableD updated), Может ли кто-нибудь объяснить, почему хранимая процедура откатывается с ошибкой взаимоблокировки, но функция внутри хранимой процедуры все еще фиксируется.

может ли кто-нибудь объяснить, почему моя хранимая процедура вызывает ошибку взаимоблокировки?

Мы не можем сказать вам, почему ваш код заходит в тупик. Вам необходимо проверить монитор состояния innodb после получения ошибки взаимоблокировки, чтобы выяснить, что ее вызвало.

Shadow 22.04.2024 17:30
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Довольно сложно сказать, что вызывает тупик, основываясь только на предоставленной вами информации. Пока проблема возникает, вы можете попробовать собрать некоторую информацию. В Performance_schema есть несколько мест, которые могут содержать полезную информацию: Таблица data_locks, Таблица data_lock_waits , Таблица Metadata_locks

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

SHOW ENGINE INNODB STATUS\G

это также будет содержать некоторую полезную информацию о происходящих блокировках.

Вы можете получить все данные с помощью pt-stalk, инструмента из Percona Toolkit, который предназначен для проведения углубленного сбора данных, представляющих состояние базы данных. Вы можете скачать его с:

wget https://percona.com/get/pt-stalk

Вы можете запустить выполнение вручную:

./pt-stalk --no-stalk --iterations=1 --user=root --ask-pass

Данные, которые вы хотите просмотреть, находятся в файлах:

*-ps-locks-transactions
*-transactions
*-lock-waits
*-innodbstatus1
*-innodbstatus2

Не всегда все файлы будут созданы, это зависит от ситуации в базе данных. По умолчанию pt-stalk создает свои данные в /var/lib/pt-stalk.

Другие вопросы по теме