17.05.2006, 17:45 | #21 |
Участник
|
Цитата:
Сообщение от Torin
Logger, мы не сдвинемся с места, пока не скажете, участников дедлока, что они делали, и на каком уровне дедлок (запись, страница и т.п.). Подозреваю, что Оракл может также сказать на каком объекте и еще массу полезной информации.
SELECT a.itemid, a.postedqty, a.postedvalue, a.deducted, a.received, a.reservphysical, a.reservordered, a.onorder, a.ordered, a.quotationissue, a.quotationreceipt, a.del_configid, a.inventdimid, a.closed, a.registered, a.picked, a.availordered, a.availphysical, a.physicalvalue, a.arrived, a.physicalinvent, a.closedqty, a.lastupddatephysical, a.lastupddateexpected, a.postedvalueseccur_ru, a.physicalvalueseccur_ru, a.recid FROM inventsum a WHERE ((SUBSTR(NLS_LOWER(dataareaid), 1, 3) = NLS_LOWER(:in1)) AND ((SUBSTR(NLS_LOWER(itemid), 1, 20) = NLS_LOWER(:in2)) AND (SUBSTR(NLS_LOWER(inventdimid), 1, 20) = NLS_LOWER(:in3)))) FOR UPDATE Вроде как на записях (ну оракл обычно по записям и блокирует - по странично это MS SQL) - но точно сейчас не скажу. Последний раз редактировалось Logger; 17.05.2006 в 17:56. |
|
17.05.2006, 18:04 | #22 |
Участник
|
Возникла мысль в защиту сортировки по lineNum, по факту в рамках заказа он совпадает с сортировкой по inventTransId. Не берусь судить, но может так получиться, что при смене сортировки от дедлоков в inventsum можно плавно перейти к дедлокам в inventTrans. А в рамках вашего рассуждения, полностью согласем. по itemId логичнее.
С уважением, itfs. |
|
17.05.2006, 18:26 | #23 |
Участник
|
Цитата:
Сообщение от itfs
Возникла мысль в защиту сортировки по lineNum, по факту в рамках заказа он совпадает с сортировкой по inventTransId. Не берусь судить, но может так получиться, что при смене сортировки от дедлоков в inventsum можно плавно перейти к дедлокам в inventTrans. А в рамках вашего рассуждения, полностью согласем. по itemId логичнее.
С уважением, itfs. |
|
17.05.2006, 18:33 | #24 |
Участник
|
Цитата:
Сообщение от itfs
Возникла мысль в защиту сортировки по lineNum, по факту в рамках заказа он совпадает с сортировкой по inventTransId. Не берусь судить, но может так получиться, что при смене сортировки от дедлоков в inventsum можно плавно перейти к дедлокам в inventTrans. А в рамках вашего рассуждения, полностью согласем. по itemId логичнее.
С уважением, itfs. а InventTransId всегда растет, так как получается по номерной серии. Если пользователи вставляли строки не в конец а в начало или где то посередине, то сортировки по LineNum и по InventTransId гарантировнано не совпадут |
|
17.05.2006, 18:41 | #25 |
злыдень
|
Цитата:
Сообщение от Logger
Ну я же написал в самом начале. :-(
Работа с разными строчками идет в одной транзакции, а заказы - в разных обрабатываются с разных рабочих мест, но одновременно Ну смотрите : заказ 1 Строка 1 Номенклатура1 Строка 2 Номенклатура2 заказ 2 Строка 1 Номенклатура2 Строка 2 Номенклатура1 С одного рабочего места начинается транзакция, которая перебирает строки заказа1 обновила строку с номенклатурой1 и на соответсвующей InventSum повесила блокировку, так что другая транзакция не сможет получить её forUpdate ( на чтение прочитает, а forUpdate - фиг) Смените Вы сортировку, что от этого изменится-то?? Не понимаю... заказ 1 Строка 1 Номенклатура1 Строка 2 Номенклатура2 Строка 3 Номенклатура3 заказ 2 Строка 3 Номенклатура3 Строка 2 Номенклатура4 Строка 1 Номенклатура5 заказ 3 Строка 3 Номенклатура2 Строка 2 Номенклатура3 Строка 1 Номенклатура4 ?????
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/ |
|
17.05.2006, 18:47 | #26 |
Участник
|
Цитата:
Сообщение от Logger
Кстати, они не совпадают.
С уважением, itfs. |
|
17.05.2006, 18:47 | #27 |
Участник
|
Цитата:
Сообщение от Recoilme
Ну и что???
Смените Вы сортировку, что от этого изменится-то?? Не понимаю... Есть блокировка на некоторое время но нет мертвой блокировки и это хорошо ! Последний раз редактировалось Logger; 17.05.2006 в 18:51. |
|
17.05.2006, 19:32 | #28 |
Участник
|
Цитата:
Сообщение от Wamr
Простое решение - сделать резервирование по всем строкам с транзакцией только на 1 строчку, а не весь заказ.
Или у вас такой особый бизнес-процесс, что это не возможно? |
|
17.05.2006, 19:38 | #29 |
Участник
|
Цитата:
Сообщение от Волчара
Вот предложено идеальное решение, существенно сокращает размер транзакции и как следствие транзакции не будут пересекаться...
Или у вас такой особый бизнес-процесс, что это не возможно? Идея действительно классная. Но я же в самом начале ответил Wamr-у что для нас это наприменимо. Почему - долго объяснять. А вы опять то же самое повторяете. Кроме того меня заинтересовали вопросы сортировки строк в заказах при обрабатке, потому что в случае одновременной обработки заказов с разных рабочих мест схожие проблемы могут появиться. Нам просто везло так как у нас не 20 человек обработку заказов делают. |
|
17.05.2006, 21:19 | #30 |
Участник
|
Цитата:
Сообщение от Logger
Не получится так.
Я тоже хотел для оптимизации сделать резерв по каждой строке в отдельной транзакции. Но по ряду причин требуют чтобы в одной транзакции было резервирование всех строк. Например если процесс резервирования использовать вместо документа "Заявка" или что то в этом роде... Вы не моглибы по подробней описать причины, по которым приходится резервировать все целиком в одной транзакции? Цитата:
Сообщение от Logger
Да, это DeadLock
Все хинты выключены. База Оракл. Версия Ax 3.0 sp3 |
|
18.05.2006, 09:25 | #31 |
злыдень
|
Если нельзя раздробить транзакции - попробуйте вынести функцию резервирования в пакетный режим, будет последовательная обработка.
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/ |
|
19.05.2006, 11:31 | #32 |
Ищущий знания...
|
У меня обсалютно тажа проблема, только на СКЛ2000... И заказы у нас по 2000 а то и по 3000 строк ... пробывали делить транзакции по строкам, не помогло..
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
19.05.2006, 12:40 | #33 |
Участник
|
Цитата:
Сообщение от lev
У меня обсалютно тажа проблема, только на СКЛ2000... И заказы у нас по 2000 а то и по 3000 строк ... пробывали делить транзакции по строкам, не помогло..
Делить транзакцию по строкам не помогло, совсем? Надо делать так: 1. Попытаться зарезервировать строчку в отдельной транзакции 2. Если не помогло перейти к следующей строке 3. По завершении, попытаться повторно зарезервировать строчки, где были проблемы... Если все сделано все правильно то эффект хоть какойто должен быть. Не забывайте его измерять по возможности более точно. А если после одной не удачной строки отменять все предыдующие, или останавливать процесс, то конечно лучше не будет Еще раз обращаю внимание, на железо: дело может быть еще и там..... |
|
17.11.2007, 10:08 | #34 |
Участник
|
Возникла такая же проблема. В одной транзакции необходимо необходимо произвести резервирование заказа. Заказы бывают по 1000 и более строк. При параллельной обработке таких заказов (абсолютно разные номенклатуры и разные склады) возникают блокировки на InventSum в методе (InventUpd_Rezervation/updateRezerveMore). Тип блокировки Блокировка ключа индексации.
Может кто-нибудь за это время решил эту проблему.. |
|
18.11.2007, 01:38 | #35 |
Участник
|
Цитата:
Сообщение от AvrDen
Возникла такая же проблема. В одной транзакции необходимо необходимо произвести резервирование заказа. Заказы бывают по 1000 и более строк. При параллельной обработке таких заказов (абсолютно разные номенклатуры и разные склады) возникают блокировки на InventSum в методе (InventUpd_Rezervation/updateRezerveMore). Тип блокировки Блокировка ключа индексации.
Может кто-нибудь за это время решил эту проблему.. Разработчики Microsoft Dynamics AX 4.0 Также, следует почитать вот эту статью участника fed http://www.ms-dynamics.ru/blog/2007/...s-ax-4-i-imts/ |
|
|
За это сообщение автора поблагодарили: gl00mie (3). |
18.11.2007, 22:09 | #36 |
Участник
|
Цитата:
Сообщение от Logger
Есть проблема - возникают мертвые блокировки при резервировании по заказу. В системе создана функция которая в одной транзакции резервирует все строки по заказу. Мертвые блокировки возникли на таблице InventSum. Первая догадка - мертвые блокировки возникают потому что при резервировании разных заказов номенклатуры в них перебираются в разном порядке. Чтобы этого избежать правильнее было бы везде при переборе строк заказа ставить сортировку по ItemId а также в классах ответственных за резервирование стараться чтобы аналитики перебирались в одном порядке.
Цитата:
Сообщение от kashperuk
Конечно решили. Разработчики Microsoft Dynamics AX 4.0 Также, следует почитать вот эту статью участника fed http://www.ms-dynamics.ru/blog/2007/...s-ax-4-i-imts/
Цитата:
От пользователей, работающих со старыми версиями Dynamics AX, достаточно часто приходится слышать жалобы на низкую производительность модуля логистики. Что нибудь типа “У нас стоит сервер БД на 4-х двухядерных Xeon (Opteron), 16 гигабайт оперативки и на небольшой 5 гигабайтной базе [...] можно увидеть длинную очередь блокировок процессов, причем все блокированные процессы ожидают освобождения записей в таблице inventSum
Цитата:
Посмотрев на проблему свежим взглядом, разработчики (кстати – уже в Microsoft, a не в Navision), сделали простой вывод: Раз мы не можем отказаться от блокировки остатков, надо просто перенести операции блокировки остатков, их проверки и обновления в самый конец транзакции, чтобы блокировка (которая длится до конца транзакции) не длились слишком долго. Сделано это было следующим образом: При обновлении таблицы складских проводок (inventTrans), обновления в inventSum НЕ ПИШУТСЯ. Вместо этого добавляется информация об обновлении в таблицу inventSumDelta и inventSumDeltaDim. При этом делается это в основном соединении и транзакции – дополнительных соединений не открывается в принципе.
Цитата:
Цитата:
|
|
19.11.2007, 16:29 | #37 |
Участник
|
Цитата:
Хочется же надеяться на лучшее. к слову, проблема вылезает не только при описанном способе резервирования, а и при обработке заказов. Ну с обработкой заказов скорее всего на IMTS закладывались. |
|