07.11.2012, 16:23 | #1 |
Moderator
|
Проблемы с кэшированием inventSum в DAX2012
Коллега показал интересную граблю. Я пока не уверен на 100% что это системная бага, но очень похоже что это так, так что я решил поделиться. Итак: DAX2012 CU3 (без feature pack). Коллега написал маленький дисплейный метод, который тупо выводит для строки заказа незарезервированный остаток. (Не самый лучший способ с точки зрения производительности, но клиент хочет, да и по большому счету проблема не в этом). Демонстрировал мне несколько раз такую картину: По строке заказа ноль. Он запускает развертывание, система создает плановую закупку, он его утверждает и разносит накладную. Возвращается в заказ и рефрешит строку - там по прежнему ноль. Далее коллега идет и синхронизирует inventSum. Заказ показывает правильный остаток. Дальше по заказу разносится отоброчная накладная. Опять - в строке заказа показывает доступное количество (ненулевое). Если опять отсинхронизировать inventSum, количество меняется на правильное - нулевое.
К своему глубокому изумлению, обнаружил что в inventSum стоит кэширование в режиме notInTTS. Причем стоит давно - по крайней мере с версии 2009. Моя гипотеза, почему вся эта ситуация происходит: 1. Как известно, в большинстве случаев, inventSum обновляется через directSQL. (Исключение - ситуации когда транзакция должна обновить всего одну строку в inventSum). 2. Система кэширования AOS не отслеживает обновлений через directSQL, и продолжает хранить в кэше старые данные. Соответственно - чтения данных через inventOnHand или большая часть прямых запросов через inventSum обрабатываются из кэша и возвращают старые данные. 3. В старых версиях аксапты, эта грабля не порождала такого множества проблем, поскольку в старых версиях из кэша обрабатывались только простейшие запросы с запросом из одной таблицы с всеми полями уникального индекса с выражении where. Поскольку 99% процентов запросов по inventSum идут с джойном по inventDim, механизм кэширования не срабатывал, и данные вытаскивались каждый раз из сиквела. В 2012ой поддержали кэширование для джойнов (возможно не для всех случаев, но для части - точно поддержали) и грабля сработала. В общем - мы до уточнения тупо отключили кэширование inventSum. Похоже что шансы неправильной работы inventOnHand за пределами транзакции - достаточно высоки, а дополнительная нагрузка от показа количеств на складе во всяких отчетах и дисплейных формах - незапредельная. Кроме того - я вообще не вижу большого смысла включать какое-либо кэширование у такой волатильной таблицы как inventSum. Я еще могу понять режим NotInTTS для заказов и закупок (обычно их только один человек правит и вероятность конфликта невысока), но понять кто и зачем включил этот режим для inventSum (даже если забыть грабли с directSQL) - я не могу... |
|
|
За это сообщение автора поблагодарили: macklakov (5), Владимир Максимов (5), Pustik (5), sukhanchik (7), Logger (5), Greggy (1), lev (5), MikeR (5), gl00mie (3), Stitch_MS (2), shogel (1), S.Kuskov (5). |
07.11.2012, 17:02 | #2 |
Участник
|
|
|
07.11.2012, 18:14 | #3 |
Участник
|
Изменение ОЧЕНЬ старое. Еще в Ax2.5 стояло NotInTTS. Скорее всего, этот режим не то, чтобы включили, а просто не меняли, при переходе на новые версии.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: macklakov (5). |
13.11.2012, 17:05 | #4 |
Участник
|
А можете выложить проектик, чтобы удобно было воспроизвести?
Теоретически, да, такое может быть. Но непотяно, насколько это реально актуально |
|
13.11.2012, 17:20 | #5 |
Участник
|
А он дисплей метод случаем не кэшировал на форме?
|
|
13.11.2012, 17:21 | #6 |
Moderator
|
|
|
13.11.2012, 18:26 | #7 |
Участник
|
Только что зарепродьюсил с горем пополам.
Узнаю, что можно сделать на данный момент с этим. |
|
|
За это сообщение автора поблагодарили: fed (5), EVGL (5). |
13.11.2012, 18:42 | #8 |
Moderator
|
А что за горе то, если не секрет ? Я уверен, что это точно репродьюситься если ты запрашиваешь строку inventSum по itemId и inventDimId, и подозреваю что иногда это случается и на штатных запросах с джойном...
|
|
13.11.2012, 19:12 | #9 |
Участник
|
Ну, горе было не с репродьюсингом, а с понятием, из-за чего именно проблема.
Это случается только в двух случаях: 1. Если InventSum обновляется через DirectSQL (как в случае выше), из другого connection 2. Если InventSum обновляется через другой UserConnection, но почему-то только если это происходит из другого клиента (неважно на сервере или клиенте). Помогает flush таблицы, но в первом случае он обязательно должен выполняться на сервере |
|
14.11.2012, 18:45 | #10 |
Участник
|
Итого, в 6.2 его не пофиксили, потому что уже слишком поздно.
Но я настоял на том, чтобы попробовать его пофиксить через SE канал, как hotfix. Как заинвестигейтим хороший фикс, дам знать. |
|
14.11.2012, 19:33 | #11 |
Moderator
|
Мне кажется, что лучший фикс - это запрет кэширования inventSum. Просто не могу ни одной практической ситуации придумать, где это кэширование было бы полезно.
|
|
|
За это сообщение автора поблагодарили: Logger (3). |
14.11.2012, 19:58 | #12 |
Участник
|
а если 2 раза подряд нажимать кнопку в наличии (для всех номенклатур)?
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. |
|
14.11.2012, 20:51 | #13 |
Участник
|
ох ты, сейчас внимательно рассмотрел - конкретная бага
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. |
|
15.11.2012, 09:34 | #14 |
Участник
|
У нас подобная бага была ( Ax3 SP4 Oracle 11).
Проблема решилось при CasheLookup = None. Плюсом заметно сократились касты в запросах к этой табл.
__________________
Axapta 3 SP4 KR3; Oracle 11.2.0.2.0 |
|
15.11.2012, 12:35 | #15 |
Участник
|
Кстати, одной из причин не фиксить это прям сейчас было отсутствие SE багов про это.
Здесь уже упомянута 2 раза такая проблема - почему никто не зарепортил на MS Connect? |
|
15.11.2012, 13:10 | #16 |
Участник
|
|
|
15.11.2012, 13:15 | #17 |
Участник
|
и что вообще такое касты?
|
|
19.11.2012, 13:01 | #18 |
Участник
|
Извиняюсь, хотел написать не "касты", а costы.
Уточню: заметно сократилось время выполнения запросов при обращении к InventSum как на чтение, так и на update. Косты замерял в PL-SQL developer. Рассинхронизация данных до этого наблюдалась между АОСами. Связано это с тем, что данная таблица у нас практически постоянно апдэйтится (одна и та же запись), причем с разных АОСов. К тому же она немного шире, чем в стандарте (свои доработки). Часто наблюдалась ситуация, когда транзакции выстраивались в очередь и нервно-курили в ожидании завершения какого-нибудь относительно долгого запроса на update.
__________________
Axapta 3 SP4 KR3; Oracle 11.2.0.2.0 |
|
19.11.2012, 13:27 | #19 |
Модератор
|
Меняем кэширование на сервере приложений - меняются косты на сервере БД ?
__________________
-ТСЯ или -ТЬСЯ ? |
|
19.11.2012, 17:29 | #20 |
Участник
|
Цитата:
если взять отдельный запрос - то план исполнения и косты одинаковые естественно будут. Но если смотреть в целом с учетом взаимных блокировок (а БД надо получить актуальные на данный момент времени данные, для чего синхронизировать инф из кэша), то суммарная разница в костах (не по запросам) в разы отличается. к таму же при сильной загузке видны блокировки и переполнение tmp tablespace При полном отключении кэширования таблицы на АОСе/клиенте данные сразу пишутся в БД (точнее в кэш БД, но это уже не важно. главное все клиенты видят синхронизированные данные).
__________________
Axapta 3 SP4 KR3; Oracle 11.2.0.2.0 |
|