08.01.2010, 18:42 | #1 |
Участник
|
InventSum
Доброго всем времени суток!
Решил обратиться за помощью к гуру акспапты. sql 2000 axapta 3.0 sp5 после изменения механизма расчета аванса появились блокировки на таблице inventsum, в которой у нас всего 13 записей..(при одновременном расчете) включив sql-трассировку, получаю вот: Код: 252655 мс на 'EXECUTE+FETCH (execute, first chunk of data)': 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.RECVERSION,A.RECID FROM INVENTSUM A WITH( INDEX(I_174ITEMDIMIDX), UPDLOCK) WHERE ((DATAAREAID=?) AND ((ITEMID=?) AND (INVENTDIMID=?))) OPTION(FAST 1) тормозит в методе X++: static InventSum find(ItemId itemId, InventDimId dimId, boolean _forUpdate = false) { InventSum inventSum; ; if (_forUpdate) { inventSum.selectForUpdate(_forUpdate); if (appl.inventUpdateTTSControl().mustUseTTSSystem()) inventSum.setConnection(appl.inventUpdateTTSControl().DBConnectionUpd()); } if (itemId) select firstonly inventSum index hint ItemDimIdx where inventSum.itemId == itemId && inventSum.inventDimId == dimId; return inventSum; } люди добрые, помогите index hint убирал, не помогает..(
__________________
..в каждой программе есть хотя бы одна ошибка.. |
|
09.01.2010, 01:04 | #2 |
Участник
|
попробуйте перестроить индексы таблицы inventsum (переиндексация из аксапты)
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет. |
|
09.01.2010, 07:53 | #3 |
Участник
|
Цитата:
попробуйте перестроить индексы таблицы inventsum (переиндексация из аксапты)
У нас и еженочной джоб есть на ренидексацию..
__________________
..в каждой программе есть хотя бы одна ошибка.. |
|
09.01.2010, 09:11 | #4 |
Участник
|
при аналогичном расчете на тестовом приложении, если делать его в одиночестве, зависаний на inventsum не наблюдается..
__________________
..в каждой программе есть хотя бы одна ошибка.. |
|
09.01.2010, 14:23 | #5 |
Программатор
|
_forUpdate = true или false?
если true, то попробуйте закоментить X++: if (appl.inventUpdateTTSControl().mustUseTTSSystem())
inventSum.setConnection(appl.inventUpdateTTSControl().DBConnectionUpd()); честно признаюсь не знаю нафига это там вставлено , но если закоментить, то блокировок не будет скорее всего. но наверно ето не правильно Да и Аксы под рукой нет(отдыхаем веть) чтоб что-либо проверить. А что такое "точка учета?". Просто интересно. Последний раз редактировалось Sada; 09.01.2010 в 14:31. |
|
|
За это сообщение автора поблагодарили: Alexanderrrr (1). |
09.01.2010, 15:08 | #6 |
Модератор
|
Это код для поддержки IMTS, если его закомментировать, лучше точно не станет (при неиспользуемом IMTS - ничего не изменится, при использовании - станет хуже именно за счет блокировок именно на InentSum)
Alexanderrrr, Вы не там ищете. Блокировки в InventSum.find() - это следствие, а причина где-то в дебрях "расчета аванса", который зачем-то выполняет блокировку запасов в наличии, его и копайте
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
За это сообщение автора поблагодарили: Alexanderrrr (1). |
09.01.2010, 16:01 | #7 |
Участник
|
во-первых, спасибо за ответы!
Цитата:
Alexanderrrr, Вы не там ищете. Блокировки в InventSum.find() - это следствие, а причина где-то в дебрях "расчета аванса", который зачем-то выполняет блокировку запасов в наличии, его и копайте
X++: /* Select table InventSum for update */ public InventSum inventSumSelectLocked(InventTrans inventTrans) { InventSum inventSum; ; if (!this.mustUseTTSSystem()) inventSum = InventSum::find(inventTrans.itemId,inventTrans.inventDimId,true); else { if (!this.dBConnectionUpd() || !TTSLevel_Upd || !appl.ttsLevel()) throw error(strfmt("@SYS69842",funcname())); inventSum.setConnection(this.dBConnectionUpd()); select firstonly forupdate inventSum index hint itemDimIdx where inventSum.ItemId == inventTrans.itemId && inventSum.InventDimId == inventTrans.inventDimId; } return inventSum; } X++: void update(NoYes dropInventOnHand= NoYes::No) { InventTrans this_Orig; InventSum inventSum; ttsbegin; this.setStatusDate(); this.setClosedOpen(); //Dual Warehouse --> this.setClosedOpenSecCur_RU(); //Dual Warehouse <-- this.setDirection(); if (!dropInventOnHand) { this_Orig = this.orig(); appl.inventUpdateTTSControl().setTTSBeginUpd(); if (InventSum::mustInventTransBeUpdated(this,this_Orig)) { inventSum = appl.inventUpdateTTSControl().inventSumSelectLocked(this); if (!inventSum.canInventTransBeUpdated(this_Orig)) { inventSum.updateInventTrans(this,NoYes::Yes,null,false); inventSum = appl.inventUpdateTTSControl().inventSumSelectLocked(this_Orig); inventSum.updateInventTrans(this_Orig,NoYes::No,null,true); } else inventSum.updateInventTrans(this,NoYes::Yes,this_Orig); } else if (InventSum::mustInventTransBeLogUpdated(this,this_Orig)) { appl.inventUpdateTTSControl().insertInventSumLogTTS(this,NoYes::Yes,inventSum); appl.inventUpdateTTSControl().insertInventSumLogTTS(this_Orig,NoYes::No,inventSum,true); } this.updateTransIdReturn(); appl.inventUpdateTTSControl().setTTSCommitUpd(); } super(); ttscommit; }
__________________
..в каждой программе есть хотя бы одна ошибка.. Последний раз редактировалось Alexanderrrr; 09.01.2010 в 16:12. |
|
09.01.2010, 18:59 | #8 |
Злыдни
|
Alexanderrrr, послушайте внимательно участника Vadik - он дело говорит. Посмотрите - какой процесс в этот момент блокирует InventSum, откуда происходит блокировка.
|
|
10.01.2010, 20:38 | #9 |
Участник
|
Цитата:
Alexanderrrr, послушайте внимательно участника Vadik - он дело говорит. Посмотрите - какой процесс в этот момент блокирует InventSum, откуда происходит блокировка.
простите, если вопрос покажется глупым
__________________
..в каждой программе есть хотя бы одна ошибка.. |
|
11.01.2010, 08:55 | #10 |
Злыдни
|
|
|
11.01.2010, 09:06 | #11 |
Участник
|
как я понял в axapta 3.0 существует проблема с блокировками на inventsum..
пользователи получают сообщение о "тупиковой ситуации".. http://www.ms-dynamics.ru/blog/2007/...s-ax-4-i-imts/ пока непонятно только, почему это проблема возникла только сейчас..что же я зацепил..
__________________
..в каждой программе есть хотя бы одна ошибка.. |
|
11.01.2010, 09:33 | #12 |
Злыдни
|
Так у вас IMTS включено или нет?
|
|
11.01.2010, 10:15 | #13 |
Участник
|
Цитата:
Так у вас IMTS включено или нет?
включить?
__________________
..в каждой программе есть хотя бы одна ошибка.. |
|
11.01.2010, 10:32 | #14 |
Злыдни
|
Нет, не стОит.
Alexanderrrr, Вы знаете, что такое блокировки? Что вы имели в виду, когда писали "при одновременном расчете"? Название процедуры sp_who2, например, Вам о чем-нибудь говорит? Последний раз редактировалось Yprit; 11.01.2010 в 10:35. |
|
11.01.2010, 10:41 | #15 |
Участник
|
Цитата:
Нет, не стОит.
Alexanderrrr, Вы знаете, что такое блокировки? Что вы имели в виду, когда писали "при одновременном расчете"? Название процедуры sp_who2, например, Вам о чем-нибудь говорит? зачем на inventsum нужны блокировки мне понятно, и что такое блокировки тоже. под одновременным расчетом имелся ввиду запуск расчета несколькими юзерами. почитал про imts..дело в том, что мы не используем режим управления запасами на предприятии.
__________________
..в каждой программе есть хотя бы одна ошибка.. |
|
11.01.2010, 10:57 | #16 |
Злыдни
|
Тогда посмотрите на стэк вызовов - откуда и зачем у вас InventTrans с InventSum обновляются, если "режим управления запасами не используется". И посмотрите, кто "держит" InventSum в момент возникновения блокировки. Может, у вас один процесс расчета схватил эти несчастные 13 записей и не отпускает, пока свои мифические авансы не досчитает. Вот остальные процессы и курят по 5 минут.....
|
|
|
За это сообщение автора поблагодарили: Alexanderrrr (1). |
11.01.2010, 11:45 | #17 |
Участник
|
Цитата:
Тогда посмотрите на стэк вызовов - откуда и зачем у вас InventTrans с InventSum обновляются, если "режим управления запасами не используется". И посмотрите, кто "держит" InventSum в момент возникновения блокировки. Может, у вас один процесс расчета схватил эти несчастные 13 записей и не отпускает, пока свои мифические авансы не досчитает. Вот остальные процессы и курят по 5 минут.....
а могу ли я вообще исключить операции с InventTrans, InventSum в процессе расчета, если учесть, что режим "управление запасами" мы не юзаем? ведь это из стандартного функционала..
__________________
..в каждой программе есть хотя бы одна ошибка.. |
|
11.01.2010, 12:01 | #18 |
Злыдни
|
смотря что Вы называете "механизмом расчета аванса"...
|
|
12.01.2010, 07:43 | #19 |
Участник
|
попробовал включить imts..
включение imts на тестовом сервере помогло ликвидировать блокировки на inventsum, да и быстрее расчет стал отрабатывать..буду искать подводные камни и пробовать на сервере боевом
__________________
..в каждой программе есть хотя бы одна ошибка.. |
|