|
04.08.2021, 00:12 | #1 |
Участник
|
deadlock в кастомном батч джобе
D365FO 10.0.20
Есть кастомный джоб на SysOperationsFramework, задача которого создать запись в таблице, выполнить запрос к внешнему ресурсу и проапдейтить запись с результатом запроса. Выполняется все это дело по нескольким компаниям одновременно, а коткретно сразу в 6-8 компаниях и с 8 потоками в каждой компании. В половине потоков наблюдаются дедлоки, жертвами являются практически все запросы на обновление (update) основной таблицы с транзакциями. Все дедлоки наблюдаются в праймари индексе таблицы. Он уникальный и кластерный. Есть несколько других индексов, но они не уникальные и в дедлоках не светятся. ВОПРОС: как решить вопрос с дедлоками? Как временное решение, праймари индекс был изменен на не-кластерный, пока тестируем. Судя по наличию дедлока, в некоторых случаях сначала блокируется таблица, а потом индекс, а в других апдейтах сначала индекс а потом таблица. Как определелить какой будет порядок блокирования по коду в X++? Если же они блокируются в одинаковом порядке, то дедлоков по идее быть не должно, должны быть ожидания... |
|
04.08.2021, 19:29 | #2 |
Участник
|
Вы наверно создаете сперва запись пустышку, а затем обновляете ее, возможно сильно увеличив размер записи.
Может у вас при обновлении страничка расщепляется в таблице. Попробуйте обойтись без обновления, только вставкой. |
|
04.08.2021, 22:54 | #3 |
Участник
|
Logger: Спасибо за идею, у меня тоже была такая, но, к сожалению, реализовать такое невозможно в данном случае.
|
|
04.08.2021, 23:28 | #4 |
Участник
|
Цитата:
В крайнем случае сделайте две идентичных таблицы, А и Б. Запись-пустышку пишите в А и отправляйте запрос во внешнюю систему. После получения ответа вставляйте полную запись в Б и удаляйте старую запись из А одной транзакцией. Если нужно видеть все записи в одном гриде, сделайте вьюху типа Union. Другой вариант - при апдейтах каждому из восьми процессов назначить свой диапазон обработки. Скажем, если первое поле в первичном ключе содержит ItemId, и все ItemId в системе начинаются с цифры, то первому процессу назначить «0*», второму «1*» или «1*, 2*» и т.д. |
|
06.08.2021, 21:45 | #5 |
Участник
|
Цитата:
На самом деле проблема уже решена - мое предположение заменить кластерный индекс на некластерный сработало - за три дня не было ни одного дедлока при постоянном очень интенсивном тестинге. |
|
|
За это сообщение автора поблагодарили: Vadik (1). |
08.08.2021, 13:39 | #6 |
Модератор
|
Кластерный индекс был составной или состоял из одного поля? RecId, Guid, номерная серия в FO, еще что-то ? Если составной, были ли при обработке изменения в ключевых полях ?
__________________
-ТСЯ или -ТЬСЯ ? |
|
09.08.2021, 15:53 | #7 |
Участник
|
Цитата:
Лучше избегать лишних операций с SQL. |
|
04.08.2021, 19:33 | #8 |
Модератор
|
Цитата:
Мысль #2: если такой сетап выбран осознанно и обработка неизбежных дедлоков реализована корректно - в чем проблема?
__________________
-ТСЯ или -ТЬСЯ ? |
|
04.08.2021, 23:00 | #9 |
Участник
|
Цитата:
Сообщение от Vadik
Мысль #1: не зарываясь в детали (которых все равно в Вашем сообщении крайне мало чтобы пробовать чинить такое "по фотографии") - а не хотите сериализовать запуски этих джобов в рамках одной компании, поместив их тасками в один джоб вместо параллельных джобов?
Мысль #2: если такой сетап выбран осознанно и обработка неизбежных дедлоков реализована корректно - в чем проблема? #2: обработка проведена корректно, но наличие дедлоков, особенно на продакшене, недопустимо так как сильно влияет на производительность всей БД. Не совсем понятно, почему возникают именно дедлоки, а не события ожидания, т.к. порядок вызова и, следовательно, блокирования обьектов БД одинаковый. |
|
06.08.2021, 09:00 | #10 |
Участник
|
А разве deadlock возможен на OCC enabled таблице? вы случайно не используйте update_recordset где-нибудь в коде?
|
|
Теги |
d365fo, deadlock |
|
Похожие темы | ||||
Тема | Ответов | |||
ODBCConnection и обработка deadlock | 7 | |||
dynamicsaxtraining: What is Lock, Deadlock in Dynamics AX | 0 | |||
DeadLock. Один сеанс - несколько процессов. | 20 | |||
Пример DeadLock | 0 | |||
DeadLock | 0 |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|