Через раз вылетают deadlock'и на update с подзапросом select

Setor

Новичок
Через раз вылетают deadlock'и на update с подзапросом select

Есть ли какие-то способы избавиться от [1213] Deadlock found when trying to get lock; try restarting transaction на запросах вида:

UPDATE table A, ( SELECT ... FROM table LEFT JOIN table ... ) B SET ... WHERE ...

в апдейте и селекте используется одна и та же таблица! в лефт джойне или та же или другая таблица.

Назначение запроса - обновление дерева nested seets (задание элементам дерева некоторых флагов).

Пока что склоняюсь либо к использованию temporary table, чтобы разделить селект и апдейт, либо оптимизировать селект, чтобы он возвращал только те строки, которые действительно надо обновить и делать обновление вручную (из скрипта).

-~{}~ 19.02.08 23:43:

В документации, если я правильно понял, советуется при обнаружении deadlock просто повторить запрос... Ещё один вариант решения проблемы.
 

Setor

Новичок
Автор оригинала: Beavis
Setor
а что за флаги ты устанавливаешь в nested sets?
Флаги "активности" узлов дерева. Допустим, каждый элемент дерева - каталог продуктов, если в каталоге есть продукты, ставится флаг, что там есть продукты, если нету - флаг - продуктов нету (это упрощённый пример, на деле посложнее). Требуется для того, чтобы не отображать пустые узлы. Приходится учитывать флаги верхних уровней и в зависимости от них устанавливать флаги нижних уровней, чтобы не отображать родительские узлы, в которых все чилды неактивные. В общем, мудрёная система...

-~{}~ 20.02.08 00:51:

P.S. я понимаю, что эта информация не относится к самому дереву, а только к его отображению, но пока ничего лучше не придумал.
 

Beavis

Banned
Setor
про deadlock'и к сожалению ничего сказать не могу, но просто вопрос: зачем хранить излишнюю информацию в базе если количество элементов узлов можно посчитать одним запросом вместе с выборкой и там где 0 просто не выводить?


Now let's produce a query that can retrieve our category tree, along with a product count for each category:
[SQL]
SELECT parent.name, COUNT(product.name)
FROM nested_category AS node ,
nested_category AS parent,
product
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.category_id = product.category_id
GROUP BY parent.name
ORDER BY node.lft;
[/SQL]
 

Setor

Новичок
Beavis
В дереве несколько тысяч узлов, и более 100 тысяч продуктов. И довольно приличная нагрузка на сайт, по этому приходится "кешировать" таким образом...

Это дерево доставлят много проблем, но зато с ним очень удобно работать в нужном нам контексте, приходится извращаться, чтобы получить красивый Explain для отображения дерева, а сама операция кеширования достаточно тормозная + deadlock стал вылетать через раз.
 
Сверху