| 
			
			 | 
		#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). | |
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Изменение ОЧЕНЬ старое. Еще в Ax2.5 стояло NotInTTS. Скорее всего, этот режим не то, чтобы включили, а просто не меняли, при переходе на новые версии.
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря...  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: macklakov (5). | |
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А можете выложить проектик, чтобы удобно было воспроизвести?  
		
		
		
		
		
		
			
		
		
		
		
	![]() Теоретически, да, такое может быть. Но непотяно, насколько это реально актуально  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А он дисплей метод случаем не кэшировал на форме?
		 
		
		
		
		
		
		
			
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Moderator 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Только что зарепродьюсил с горем пополам. 
		
		
		
		
		
		
			
		
		
		
		
	Узнаю, что можно сделать на данный момент с этим.  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: fed (5), EVGL (5). | |
| 
			
			 | 
		#8 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А что за горе то, если не секрет ? Я уверен, что это точно репродьюситься если ты запрашиваешь строку inventSum по itemId и inventDimId, и подозреваю что иногда это случается и на штатных запросах с джойном...
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Ну, горе было не с репродьюсингом, а с понятием, из-за чего именно проблема. 
		
		
		
		
		
		
			
		
		
		
		
	Это случается только в двух случаях: 1. Если InventSum обновляется через DirectSQL (как в случае выше), из другого connection 2. Если InventSum обновляется через другой UserConnection, но почему-то только если это происходит из другого клиента (неважно на сервере или клиенте). Помогает flush таблицы, но в первом случае он обязательно должен выполняться на сервере  | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Итого, в 6.2 его не пофиксили, потому что уже слишком поздно. 
		
		
		
		
		
		
			
		
		
		
		
	Но я настоял на том, чтобы попробовать его пофиксить через SE канал, как hotfix. Как заинвестигейтим хороший фикс, дам знать.  | 
| 
	
 | 
| 
			
			 | 
		#11 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Мне кажется, что лучший фикс - это запрет кэширования inventSum. Просто не могу ни одной практической ситуации придумать, где это кэширование было бы полезно.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: Logger (3). | |
| 
			
			 | 
		#12 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			а если 2 раза подряд нажимать кнопку в наличии (для всех номенклатур)?
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их.  | 
| 
	
 | 
| 
			
			 | 
		#13 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			ох ты, сейчас внимательно рассмотрел - конкретная бага
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их.  | 
| 
	
 | 
| 
			
			 | 
		#14 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			У нас подобная бага была ( Ax3 SP4 Oracle 11).  
		
		
		
		
		
		
			Проблема решилось при CasheLookup = None. Плюсом заметно сократились касты в запросах к этой табл. 
				__________________ 
		
		
		
		
	Axapta 3 SP4 KR3; Oracle 11.2.0.2.0  | 
| 
	
 | 
| 
			
			 | 
		#15 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Кстати, одной из причин не фиксить это прям сейчас было отсутствие SE багов про это. 
		
		
		
		
		
		
			
		
		
		
		
	Здесь уже упомянута 2 раза такая проблема - почему никто не зарепортил на MS Connect?  | 
| 
	
 | 
| 
			
			 | 
		#16 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#17 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			и что вообще такое касты?
		 
		
		
		
		
		
		
			
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#18 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Извиняюсь, хотел написать не "касты", а costы. 
		
		
		
		
		
		
			Уточню: заметно сократилось время выполнения запросов при обращении к InventSum как на чтение, так и на update. Косты замерял в PL-SQL developer. Рассинхронизация данных до этого наблюдалась между АОСами. Связано это с тем, что данная таблица у нас практически постоянно апдэйтится (одна и та же запись), причем с разных АОСов. К тому же она немного шире, чем в стандарте (свои доработки). Часто наблюдалась ситуация, когда транзакции выстраивались в очередь и нервно-курили в ожидании завершения какого-нибудь относительно долгого запроса на update. 
				__________________ 
		
		
		
		
	Axapta 3 SP4 KR3; Oracle 11.2.0.2.0  | 
| 
	
 | 
| 
			
			 | 
		#19 | 
| 
			
			 Модератор 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
   
		
				__________________ 
		
		
		
		
	-ТСЯ или -ТЬСЯ ?  | 
| 
	
 | 
| 
			
			 | 
		#20 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
если взять отдельный запрос - то план исполнения и косты одинаковые естественно будут. Но если смотреть в целом с учетом взаимных блокировок (а БД надо получить актуальные на данный момент времени данные, для чего синхронизировать инф из кэша), то суммарная разница в костах (не по запросам) в разы отличается. к таму же при сильной загузке видны блокировки и переполнение tmp tablespace При полном отключении кэширования таблицы на АОСе/клиенте данные сразу пишутся в БД (точнее в кэш БД, но это уже не важно. главное все клиенты видят синхронизированные данные). 
				__________________ 
		
		
		
		
	Axapta 3 SP4 KR3; Oracle 11.2.0.2.0  | 
| 
	
 |