Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Коварные дедлоки - Deadlock found / 5 сообщений из 5, страница 1 из 1
13.03.2015, 20:00:29
    #38904474
Ark Bucky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коварные дедлоки - Deadlock found
Столкнулся с проблемой дедлоков на сайте-магазине

БД MariaDB 10.

Обработка заказов выглядит так:

1. START TRANSACTION;
2. UPDATE shop_items SET status=3, buyer_id=%BUYER_ID% WHERE id IN (SELECT item_id FROM shop_cart WHERE buyer_id=%BUYER_ID% AND item_type=%ITEM_TYPE%) AND status=2
3. списание баланса и прочее
4. END TRANSACTION;

Всё отлично работало, пока не увеличился потом покупателей - в часы пик в логах появились дедлоки на втором запросе:

Deadlock found when trying to get lock; try restarting transaction


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

UPDATE shop_order o
JOIN shop_items d ON o.item_id = d.id AND d.taxfree_accepted=0
SET o.check_status=5
WHERE o.item_type=%ITEM_TYPE% AND o.check_status=0;



Периодически ловлю дедлоки на нем.

Как с этим бороться?
...
Рейтинг: 0 / 0
13.03.2015, 20:06:01
    #38904477
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коварные дедлоки - Deadlock found
Ark Buckyв часы пик в логах появились дедлоки на втором запросе:И где этот второй запрос?
...
Рейтинг: 0 / 0
13.03.2015, 20:11:02
    #38904480
Ark Bucky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коварные дедлоки - Deadlock found
2. UPDATE shop_items SET status=3, buyer_id=%BUYER_ID% WHERE id IN (SELECT item_id FROM shop_cart WHERE buyer_id=%BUYER_ID% AND item_type=%ITEM_TYPE%) AND status=2
...
Рейтинг: 0 / 0
13.03.2015, 20:24:02
    #38904496
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коварные дедлоки - Deadlock found
А, второй по номеру. Я думал, что "второй" в смысле два апдейта взаимоблокируются, первый указан, а второй нет.

Конкретного решения пока не вижу.
Есть два общих:
1) Оптимизировать запросы, чтобы они выполнялись быстрее и дедлоки происходили реже. В частности, возможно, для вашей версии нужно IN (SELECT ... ) переписать через JOIN.
2) Диагностировать дедлок и попытаться выполнить транзакцию еще раз.
...
Рейтинг: 0 / 0
14.03.2015, 12:25:32
    #38904834
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Коварные дедлоки - Deadlock found
добавить order by в подзапрос
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Коварные дедлоки - Deadlock found / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]