Выполнение действия Db Deadlock found when trying to get lock; try restarting transaction

vasyaya

Client
Регистрация
09.02.2015
Сообщения
560
Благодарностей
35
Баллы
28
Всех приветствую! При работе в многопотоке с mysql возникает ошибка "
Выполнение действия Db Deadlock found when trying to get lock; try restarting transaction
"
Не понимаю как можно решить данную проблему с блокировкой таблиц в многопотоке.
Подскажите знающие люди!)
 

vasyaya

Client
Регистрация
09.02.2015
Сообщения
560
Благодарностей
35
Баллы
28
Думал запускать шаблон в 1 потоке и после прохождения кубика с mysql добавлять поток, после завершения действий в шаблоне и убирать поток.
Не знаю на сколько это верное и реализуемое решение
 

n0n3mi1y

Client
Регистрация
08.03.2017
Сообщения
1 352
Благодарностей
671
Баллы
113
А какая стоит задача вообще?
 

Dmitrymxc

Client
Регистрация
25.03.2025
Сообщения
26
Благодарностей
9
Баллы
3
Всех приветствую! При работе в многопотоке с mysql возникает ошибка "
Выполнение действия Db Deadlock found when trying to get lock; try restarting transaction
"
Не понимаю как можно решить данную проблему с блокировкой таблиц в многопотоке.
Подскажите знающие люди!)
Нужен запрос с которым возникает проблема
 

vasyaya

Client
Регистрация
09.02.2015
Сообщения
560
Благодарностей
35
Баллы
28
Нужен запрос с которым возникает проблема
START TRANSACTION;

-- Обновление временной метки timeStamp для записи с наименьшим значением timeStamp
UPDATE new_tokens
SET timeStamp = CURRENT_TIMESTAMP
WHERE id = (
SELECT id FROM (
SELECT id FROM new_tokens
ORDER BY timeStamp ASC
LIMIT 1
) AS temp
);

-- Получение только tokenAdress после обновления
SELECT tokenAdress
FROM new_tokens
WHERE id = (
SELECT id FROM (
SELECT id FROM new_tokens
ORDER BY timeStamp ASC
LIMIT 1
) AS temp
);

-- Обновление временной метки timeStamp во всех строках, где tokenAdress = {-Variable.token_adress-}
UPDATE new_tokens
SET timeStamp = CURRENT_TIMESTAMP
WHERE tokenAdress = '{-Variable.token_adress-}';

COMMIT;
 

SellProduct_AD

Новичок
Регистрация
05.04.2025
Сообщения
7
Благодарностей
3
Баллы
3
Всех приветствую! При работе в многопотоке с mysql возникает ошибка "
Выполнение действия Db Deadlock found when trying to get lock; try restarting transaction
"
Не понимаю как можно решить данную проблему с блокировкой таблиц в многопотоке.
Подскажите знающие люди!)
блокировкой таблиц плохая идея. подходит в крайних случаях.
вот что думает ИИ по этому поводу.

Полная блокировка таблицы - это "атомный молот" для решения проблемы. В 95% случаев лучше найти более точечное решение. Рассмотрите ее только если:

  • Операции очень редкие
  • Другие решения не работают
  • Вы готовы мириться с потенциальными проблемами производительности
Как реализовать (если все же решите):
sql
Copy
LOCK TABLES new_tokens WRITE;

-- Ваши операции
START TRANSACTION;
UPDATE new_tokens SET timeStamp = CURRENT_TIMESTAMP
WHERE id = (SELECT id FROM (SELECT id FROM new_tokens ORDER BY timeStamp ASC LIMIT 1) AS temp);

SELECT tokenAdress FROM new_tokens WHERE id = (SELECT id FROM (SELECT id FROM new_tokens ORDER BY timeStamp ASC LIMIT 1) AS temp);

UPDATE new_tokens SET timeStamp = CURRENT_TIMESTAMP WHERE tokenAdress = '{-Variable.token_adress-}';
COMMIT;

UNLOCK TABLES;
 

SellProduct_AD

Новичок
Регистрация
05.04.2025
Сообщения
7
Благодарностей
3
Баллы
3
START TRANSACTION;

-- Обновление временной метки timeStamp для записи с наименьшим значением timeStamp
UPDATE new_tokens
SET timeStamp = CURRENT_TIMESTAMP
WHERE id = (
SELECT id FROM (
SELECT id FROM new_tokens
ORDER BY timeStamp ASC
LIMIT 1
) AS temp
);

-- Получение только tokenAdress после обновления
SELECT tokenAdress
FROM new_tokens
WHERE id = (
SELECT id FROM (
SELECT id FROM new_tokens
ORDER BY timeStamp ASC
LIMIT 1
) AS temp
);

-- Обновление временной метки timeStamp во всех строках, где tokenAdress = {-Variable.token_adress-}
UPDATE new_tokens
SET timeStamp = CURRENT_TIMESTAMP
WHERE tokenAdress = '{-Variable.token_adress-}';

COMMIT;
Для этого запроса ИИ сделал такую оптимизацию

Причины deadlock:
  1. Несколько потоков пытаются обновлять одни и те же строки в разном порядке:
    • Первый UPDATE блокирует строку с минимальным timestamp
    • Второй поток пытается сделать то же самое, создавая конкуренцию
  2. Длительная транзакция:
    • Транзакция содержит несколько операций, увеличивая время удержания блокировок
Пример оптимизированного запроса
sql
Copy
-- Короткая транзакция для получения токена
START TRANSACTION;
SET @token_address := (
SELECT tokenAdress FROM new_tokens
ORDER BY timeStamp ASC
LIMIT 1
FOR UPDATE SKIP LOCKED
);

UPDATE new_tokens
SET timeStamp = CURRENT_TIMESTAMP
WHERE tokenAdress = @token_address;
COMMIT;

-- Отдельная транзакция для обновления по переменной
UPDATE new_tokens
SET timeStamp = CURRENT_TIMESTAMP
WHERE tokenAdress = '{-Variable.token_adress-}';
Основная идея - минимизировать время удержания блокировок и разделить конфликтующие операции.
 
  • Спасибо
Реакции: vasyaya

vasyaya

Client
Регистрация
09.02.2015
Сообщения
560
Благодарностей
35
Баллы
28
Для этого запроса ИИ сделал такую оптимизацию

Причины deadlock:
  1. Несколько потоков пытаются обновлять одни и те же строки в разном порядке:
    • Первый UPDATE блокирует строку с минимальным timestamp
    • Второй поток пытается сделать то же самое, создавая конкуренцию
  2. Длительная транзакция:
    • Транзакция содержит несколько операций, увеличивая время удержания блокировок
Пример оптимизированного запроса
sql
Copy
-- Короткая транзакция для получения токена
START TRANSACTION;
SET @token_address := (
SELECT tokenAdress FROM new_tokens
ORDER BY timeStamp ASC
LIMIT 1
FOR UPDATE SKIP LOCKED
);

UPDATE new_tokens
SET timeStamp = CURRENT_TIMESTAMP
WHERE tokenAdress = @token_address;
COMMIT;

-- Отдельная транзакция для обновления по переменной
UPDATE new_tokens
SET timeStamp = CURRENT_TIMESTAMP
WHERE tokenAdress = '{-Variable.token_adress-}';
Основная идея - минимизировать время удержания блокировок и разделить конфликтующие операции.
Не работает. Вот ошибка
Выполнение действия Db Fatal error encountered during command execution.

Я пытался через ИИ оптимизировать запросы, безрезультатно.
 

SellProduct_AD

Новичок
Регистрация
05.04.2025
Сообщения
7
Благодарностей
3
Баллы
3
Не работает. Вот ошибка
Выполнение действия Db Fatal error encountered during command execution.

Я пытался через ИИ оптимизировать запросы, безрезультатно.
Вы же не думаете что я буду посредником между вашими ошибками в базе и ИИ ?
Скормите ему ошибку, новый запрос и попробуйте новый вариант.
в данном случае скорее всего в базе мало строк и @token_address становится NULL когда запрос пропускает все занятые строки. а так как у вас запрос составной, то прямо внутри него нужна обязательная проверка на NULL.
это одна из вожможных причин. другие причины могут заключатся что ваша база не поддерживает какие то команды. поэтому, если вы сами не в курсе что из нового запроса поддерживается вашей базой, то стоит сообщить эту информацию ИИ и он подберет нужные команды.
 

vasyaya

Client
Регистрация
09.02.2015
Сообщения
560
Благодарностей
35
Баллы
28
Вы же не думаете что я буду посредником между вашими ошибками в базе и ИИ ?
Скормите ему ошибку, новый запрос и попробуйте новый вариант.
в данном случае скорее всего в базе мало строк и @token_address становится NULL когда запрос пропускает все занятые строки. а так как у вас запрос составной, то прямо внутри него нужна обязательная проверка на NULL.
это одна из вожможных причин. другие причины могут заключатся что ваша база не поддерживает какие то команды. поэтому, если вы сами не в курсе что из нового запроса поддерживается вашей базой, то стоит сообщить эту информацию ИИ и он подберет нужные команды.
Посредники не нужны спасибо.
За идею с проверкой на Null спасибо, проверю этот вариант
 

Dmitrymxc

Client
Регистрация
25.03.2025
Сообщения
26
Благодарностей
9
Баллы
3
Я некоторые вопросы решаю через функции внутри бд, спроси у gpt как сделать то что тебе нужно через функцию в бд,он даст готовый код, например я пользую таким для получения строки и изменения статуса одним запросом
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)