11.02.2009, 15:53 | #1 |
Участник
|
Аудит блокировок
Переодически возникают блокировки по InventSum и по InventTrans.
Можно ли средствами Axapt-ы где нибудь посмотреть эти блокировки? Нужна информация были ли блокировки за последний месяц по заданной номенклатуре. Если так нельзя. То как это можно настроить или запрогроммировать чтоб за следующий месяц была такая информация. Заранее спасибо.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
11.02.2009, 16:34 | #2 |
Участник
|
\Classes\JournalCheckPost\runDeadLock
впишите туда свой код, который записывает в некоторую таблицу тип журнала, время и тп... на правах пердположения) сам не пробовал...
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy |
|
11.02.2009, 17:00 | #3 |
Участник
|
Администрирование - Запросы - База данных - Журнал трассировки операторов SQL
Туда попадают Deadlock и долгие запросы. Deadlock - всегда идет по причине блокировок. Долгий запрос тоже может быть следствием блокировки, поэтому можно просто наложить фильтр по этому логу и проанализировать записи. |
|
11.02.2009, 18:30 | #4 |
MCITP
|
Не представляю даже как такое можно сделать в разрезе номенклатуры...
Долгие запросы и дедлоки - это хорошо, конечно, но никакой информации по исходному вопросу не дают. Более того, отследить тот факт, что данный долгий запрос долго работал долго из-за того, что ждал блокировки можно, насколько я понимаю, только на уровне БД. Для таблицы в целом...
__________________
Zhirenkov Vitaly |
|
11.02.2009, 19:12 | #5 |
Участник
|
Цитата:
Сообщение от ZVV
Не представляю даже как такое можно сделать в разрезе номенклатуры...
Долгие запросы и дедлоки - это хорошо, конечно, но никакой информации по исходному вопросу не дают. Более того, отследить тот факт, что данный долгий запрос долго работал долго из-за того, что ждал блокировки можно, насколько я понимаю, только на уровне БД. Для таблицы в целом... А отфильтровать по таблице использованной в запросе можно. Пример во вложении. |
|
11.02.2009, 21:02 | #6 |
Moderator
|
С учетом того, что блокировка может накладываться не только на запись, но и на страницу, экстент, таблицу или ключ индекса, решение данной задачи мне кажется невозможным.
Ну и не совсем понятно, что даст на практике такая информация. |
|
11.02.2009, 21:47 | #7 |
Участник
|
Цитата:
При обновление этих таблиц всегда setPrefix на номенклатуру есть. Да у меня остатки расходяться с проводками. Написал джобик он недолго работает 10 минут. Раз в неделю запускаю 6-8 позиций исправляет. Но надо решать эту проблему. Есть подозрения что это из-за блокировок. Хотю удостовериться в этом или в обратном. Есть мысль на inventTrans insert и update некую проверку повесить на время поиска откуда ноги растут. Но очень хочется, чтоб это оказалось из-за блокировок.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
11.02.2009, 22:03 | #8 |
----------------
|
Миша, лучше попытаться найти doUpdate по InventTrans или InventSum
Где-то на форуме было как это через перекрестные ссылки найти. |
|
11.02.2009, 22:56 | #9 |
Модератор
|
Цитата:
Цитата:
Но очень хочется, чтоб это оказалось из-за блокировок
Я бы прислушался к совету Wamr Если все-таки очень хочется найти "горячую" номенклатуру, можно попробовать такой "ход конем": - настраиваем поголовный мониторинг длинных запросов всем пользователям - включаем на AOS-е опцию internal=comments (в 3.0 работает, как в других версиях - не знаю). Теперь запрос сохранится со значениями литералов (в комментариях) - собираем эту статистику какое-то время - далее анализируем с группировкой (приводим текст запроса к varchar и группируем). Так как запрос "тяжелый", желательно делать это не на работающей системе, а выгрузить SYSTRACETABLESQL в отдельную БД. Еще лучше - на выделенный сервер. Еще лучше - дополнительно обработать табличку, добавив хэш по тексту запроса. Я таким образом строил куб на основе SYSTRACETABLESQL Но все равно непонятно (с), что это даст. Рискну предположить, что "горячей" окажется наиболее часто продаваемая номенклатура. Предложим пореже продавать? Не оценят
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
За это сообщение автора поблагодарили: Logger (6), Lucky13 (2). |
12.02.2009, 02:15 | #10 |
Участник
|
Блокировки не могут быть причиной такого расхождения. Ищите в другом месте.
Исключение - работа системы множественных складских транзакций. Но опять же там причина такого расхождения не в блокировках, а в прерывании работы системы, когда откатывается транзакция обновляющая inventTrans, но не откатывается транзакция обновлявшая inventsum. По Inventsumlogtts можно найти такие проблемы - если там есть записи с committed == 0 Но по идее Аксапта сама раз в 600 секунд делает эту проверку и таким образом восстанавливает соответствие InventTrans и InventSum |
|
12.02.2009, 02:22 | #11 |
Участник
|
|
|
12.02.2009, 09:31 | #12 |
Участник
|
Цитата:
Нужен трэйс. А для трэйса сначала надо локолизовать проблему. Это редко происходит.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
12.02.2009, 09:36 | #13 |
Участник
|
Цитата:
Сообщение от Vadik
Сами по себе блокировки - не абсолютное зло, как многие считают, а одно из средств обеспечения целостности данных в системе, поддерживающей работу нескольких конкурентных пользователей. И являться причиной неверных остатков в нормально спроектированной системе (а стандартную логику AX в области управления запасами я считатаю нормально спроектированной ) не могут
Долго подбирал данные, но смог подобрать. Правда транзакции там ни причем были. А потом мне нужно это найти не на стандарте. Прилага на 80% модифицирована по формуле mazzy.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
12.02.2009, 12:33 | #14 |
Участник
|
|
|
12.02.2009, 23:32 | #15 |
Участник
|
1) Создаём новую номенклатуру new активны склад и ГТД
2) Создаём закупку 3) Создаём строку закупки new 2 шт (скл1 + гтд1) и 4) ещё одну строку закупки new 3 шт (скл1 + гтд2) 5) Разносим отборочную накладную 6) создаём журнал перенос (резервирование автоматическое) 7) Создаём строку журнала new 6 шт скл1->скл2. Сохраняем. 8) Смотрим проводки -2шт скл1 -> скл2 гтд1 -> гтд1 -3 шт скл1 -> скл2 гтд2 -> гтд2 -1шт скл1 -> скл2 9) уменьшаем количество по строке до 5 шт сохраняем, смотрим -2шт скл1 -> скл2 гтд1 -> гтд1 -2шт скл1 -> скл2 гтд1 -> гтд1 -1шт скл1 -> скл2 гтд1 -> ?(пусто) Ну т.е. вот так см картинку
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. Последний раз редактировалось miklenew; 12.02.2009 в 23:37. |
|
13.02.2009, 00:12 | #16 |
MCITP
|
Цитата:
- откуда взялся странный вывод о том, что причина в блокировках? я бы сказал, что проблема в некорректной работе механизма авторезервирования, если всё так действительно происходит. Надо банально его протрейсить и найти баг.... - вы выше говорили что у вас "остатки расходяться с проводками", а здесь просто "испортилась" приходная проводка (InventTrans), при этом остатки у вас разве "разошлись" (InventSum)?
__________________
Zhirenkov Vitaly |
|
13.02.2009, 06:31 | #17 |
Участник
|
Да нет. Одно с другим не связано.
Там я вывернулся. Придумал выход. Просто Vadim написал, что Цитата:
Не стоит доверять системе на 100%. Всякое бывает. A logger попросил пример. Это пример с блокировками никак не связан. Просто тема немного ушла.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
13.02.2009, 09:25 | #18 |
NavAx
|
ГТД не является правильной складской аналитикой. Не стоит её считать таковой и использовать. Если вы сравните в коде ГТД с любой другой аналитикой, вы все поймете.
|
|
13.02.2009, 09:31 | #19 |
Участник
|
Цитата:
Но насколько я понял, что в кишках происходит, ГТД тут не причём, этот эффект должен и на других аналитиках повториться. Просто он мне подруку подвернулся. Да и забыл написать как исправил: InventUpd_Estimated\updateDepreciateReceipt() Место X++: while select forupdate inventTrans index hint TransIdIdx order by statusReceipt desc,inventRefTransId,inventDimId desc where inventTrans.inventTransId == movement.transId() && inventTrans.transChildType == movement.transChildType() && inventTrans.transChildRefId == movement.transChildRefId() && inventTrans.statusIssue == StatusIssue::None && inventTrans.statusReceipt >= StatusReceipt::Ordered && inventTrans.statusReceipt <= StatusReceipt::QuotationReceipt X++: while select forupdate inventTrans index hint TransIdIdx order by statusReceipt desc,inventRefTransId,inventDimId //order by statusReceipt desc,inventRefTransId,inventDimId desc where inventTrans.inventTransId == movement.transId() && inventTrans.transChildType == movement.transChildType() && inventTrans.transChildRefId == movement.transChildRefId() && inventTrans.statusIssue == StatusIssue::None && inventTrans.statusReceipt >= StatusReceipt::Ordered && inventTrans.statusReceipt <= StatusReceipt::QuotationReceipt InventDimId без ГТД появляются раньше. Следовательно между ними такая связь. InventDimId(без ГТД) < InventDimId(с ГТД) Этим и воспользовался. Просто сортировку поменял.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. Последний раз редактировалось miklenew; 13.02.2009 в 09:36. |
|
13.02.2009, 09:55 | #20 |
NavAx
|
Насчет ГТД... давно это было, ну и уже не помню что там с ней не так, но как минимум нужно в группу полей InventDimensions на InventDim добавить ГТД. Помоему еще что то в коде криво сделано. Может уже исправлено. Мы же стараемся не использовать ГТД как складскую аналитику.
На всякий случай... у нас AX3 SP4. |
|
|
За это сообщение автора поблагодарили: Logger (2). |
Теги |
internal, блокировка, лог, поиск ошибок, полезное |
|
|