Добро пожаловать в мой блог! Изначально он не задумывался как блог CRM разработчика, но жизнь сама внесла нужные коррективы. Тут я публикою все свои наблюдения относительно обозначенных в заголовке систем. Если Вы найдете в нем что-то интересное для Вас, как для заказчика, то буду рад сотрудничать с Вами! В моей компетенции 100% задач по MS CRM 3.0/4.0/2011:
MVP 2010, 2011
- Консалтинг
- Проектирование
- Разработка
- Обучение
MVP 2010, 2011
ExecuteMultiple может приводить к взаимным блокировкам в базе
Запись от Артем Enot Грунин размещена 13.06.2013 в 11:31
Начиная с UR12 система поддерживает новый разрекламированный запрос ExecuteMultipleRequest позволяющий пачками отправлять запросы к системе без необходимости обрабатывать каждое сообщение по отдельности. Эта возможность показалась мне удобной, поэтому я переписал под новую функцию весь свой код, где записи создавались в цикле. Изменение хорошо прошло тестирование на небольшом примере, но в реальной жизни почему-то возникли проблемы.
Сценарий: действия пользователя в системе приводят к срабатыванию асинхронного плагина 1 (запуск массовой операции). Плагин производит вычитку данных и использует ExecuteMultipleRequest для создания произвольного количества записей (операций). За выполнение операций отвечает синхронный плагин 2. Основной момент операций заключается в том, что они должны выполняться последовательно, так как в них происходит работа с данными, поэтому работа с базой в плагине 2 реализована с использованием блокировки:
Запуск массовой операции приводящей к созданию дочерних записей в количестве больше двух приводит к ошибке SQL Timeout.
Гуглинг привел меня к скрипту, который, предположительно позволяет определить причину блокировки: http://blog.sqlauthority.com/2010/10...irty-solution/
К сожалению, я не большой эксперт по SQL поэтому никак не могу его прокомментировать. Первые попытки отладки показали мне достаточно странные результаты: скрипт выдавал, что к блокировке приводит безобидная операция чтения, которая, к тому же, еще и выполняется в родительском плагине до запуска дочерних. Переписав блокирующий запрос с использованием QueryExpression с ключом NoLock (вместо использованного ранее QueryByAttribute) я получил чуть более правдоподобный блокирующий запрос:
Я не готов с уверенностью сказать, что проблема заключается в том, что плагины не могут определиться в какой последовательности запускаться, однако переписав код под создание записей в цикле мне удалось устранить проблему.
Если у кого-то есть дополнительные сведения, об этой проблеме, пожалуйста отпишитесь в комментариях.
Сценарий: действия пользователя в системе приводят к срабатыванию асинхронного плагина 1 (запуск массовой операции). Плагин производит вычитку данных и использует ExecuteMultipleRequest для создания произвольного количества записей (операций). За выполнение операций отвечает синхронный плагин 2. Основной момент операций заключается в том, что они должны выполняться последовательно, так как в них происходит работа с данными, поэтому работа с базой в плагине 2 реализована с использованием блокировки:
X++:
lock (SyncLock) { service.Create(operation); }
Гуглинг привел меня к скрипту, который, предположительно позволяет определить причину блокировки: http://blog.sqlauthority.com/2010/10...irty-solution/
К сожалению, я не большой эксперт по SQL поэтому никак не могу его прокомментировать. Первые попытки отладки показали мне достаточно странные результаты: скрипт выдавал, что к блокировке приводит безобидная операция чтения, которая, к тому же, еще и выполняется в родительском плагине до запуска дочерних. Переписав блокирующий запрос с использованием QueryExpression с ключом NoLock (вместо использованного ранее QueryByAttribute) я получил чуть более правдоподобный блокирующий запрос:
X++:
select "sdkmessageprocessingstep0".Stage as "stage", "sdkmessageprocessingstep0".SdkMessageProcessingStepId as "sdkmessageprocessingstepid" from SdkMessageProcessingStep as "sdkmessageprocessingstep0" where (("sdkmessageprocessingstep0".StateCode = @StateCode0 and ("sdkmessageprocessingstep0".Stage in (@Stage0 , @Stage1 , @Stage2 , @Stage3 , @Stage4 , @Stage5 , @Stage6)) and "sdkmessageprocessingstep0".SdkMessageId = @SdkMessageId0 and "sdkmessageprocessingstep0".InvocationSource = @InvocationSource0 and (("sdkmessageprocessingstep0".SdkMessageFilterId is null or "sdkmessageprocessingstep0".SdkMessageFilterId = @SdkMessageFilterId0)) and (("sdkmessageprocessingstep0".SupportedDeployment = @SupportedDeployment0 or "sdkmessageprocessingstep0".SupportedDeployment = @SupportedDeployment1)))) order by "sdkmessageprocessingstep0".Rank asc , "sdkmessageprocessingstep0".SdkMessageFilterId asc
Если у кого-то есть дополнительные сведения, об этой проблеме, пожалуйста отпишитесь в комментариях.
Всего комментариев 3
Комментарии
-
Прошу прощения у меня есть вопрос , возможно у вас есть решение ( по CRM 2011 с отдельным SQL 2008R2) Можно ли разблокировать сущность системную "Customer Relationship" для добавления fields-Rool1 и Rool2 доп. критерии в выпадающем списке?
Запись от Shevando размещена 20.06.2013 в 13:29 -
Если не понятно то я имел ввиду на форме "Customer Relationship" Customizable-False поменять на True
Запись от Shevando размещена 20.06.2013 в 13:57 -
Запись от Артем Enot Грунин размещена 20.06.2013 в 22:05