AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.02.2023, 16:26   #21  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Попробуйте класс ReqReaderWriterLock
Можно проверить, заблокирована ли конкретная запись.
Если не заблокирована, то заблокировать ее и обработать.
Если заблокирована, то пропустить её и начать обрабатывать следующую запись.

В качестве ключа в параметр _lockName метода tryEnterWriterLock передать уникальную строку, которая каким-то образом идентифицирует обрабатываемую запись.

X++:
    ReqReaderWriterLock lockCleanup = ReqReaderWriterLock::construct();
    
    while select myTable
    {
        if (lockCleanup.tryEnterWriterLock(int642str(myTable.RecId), 0)) // Блокируем, а если кем-то уже заблокировано, то обходим
        {
            ttsbegin;
            
            myTableUpd = MyTable::findRecId(myTable.RecId, true);
            
            //.....................
            myTableUpd.update();
            
            ttscommit;
        }
    }

    lockCleanup.releaseAllLocks();
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/

Последний раз редактировалось Ace of Database; 17.02.2023 в 16:56.
За это сообщение автора поблагодарили: sukhanchik (10).
Старый 17.02.2023, 16:38   #22  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Такой подход еще хорош тем, что он блокирует только записи, обрабатываемые именно этим конкретным алгоритмом. Для этого в параметр в качестве ключа в параметр _lockName можно передавать не только RecId таблицы в текстовом виде, но и дописывать некий текстовый константный префикс, который определяет именно эту обработку.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 17.02.2023, 17:37   #23  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Ace of Database Посмотреть сообщение
Такой подход еще хорош тем,...
Подход может и хорош, но сам класс так себе. Недавно коллега обнаружил что блокировка ставится без учета имени бд ! Т.е. если у вас на одном инстансе SQL крутится 2 инсталляции аксапты (2 рабочие) или дев и тест, то между ними могут быть блокировки из-за того что этот класс не учитывает имя бд !

В частности это выражается в неожиданных блокировках при попытке одновременно запустить синхронизацию в двух инсталляциях аксапты. Также при пакетной обработке и куче других мест где задействован этот класс.

Попробовал его исправить, добавив имя базы в имени блокировки.
Вложения
Тип файла: zip ReqReaderWriterLock_Fix.zip (6.4 Кб, 27 просмотров)
За это сообщение автора поблагодарили: sukhanchik (10), Ace of Database (10), trud (2), gl00mie (10), SRF (5).
Старый 17.02.2023, 17:38   #24  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
А вообще, я бы не изобретал разные костыли и по максимуму бы задействовал БД через индексы (как выше предлагал). Так проще и надежнее. И весь контроль на уровне БД идет.
Старый 22.02.2023, 17:01   #25  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Logger Посмотреть сообщение
Цитата:
Сообщение от DarkSpirit22 Посмотреть сообщение
В голову еще приходит SQL filtered unique index:
А как вы его из аксапты сделаете, да еще и гарантируете, что он не слетит при следующей синхронизации ?
Из Аксапты фильтрованный индекс не сделать, она такое не умеет, но из Аксапты можно сделать "обычный" уникальный индекс, а уже на уровне СУБД сделать его фильтрованным. Замечено, что синхронизация БД из Аксапты "не различает", фильтрованный в базе индекс или нет, а смотрит только на название/порядок полей и проч. Таким вот образом в D365FO решалась задача "отключения" ненужных/вредных индексов стандартного приложения: поменять свойства стандартного индекса в приложении нельзя (с тех пор, как закрыли overlayering), но можно на стороне СУБД добавить индексу условие вида where partition = 0 - и вуаля! А тут можно добавить условие вида where active = 1. Конечно, если вдруг понадобится поменять индекс, то синхронизация попытается его пересоздать, и тогда надо будет заново приклеивать фильтрацию со стороны СУБД. Но в остальном всё работает нормально.

Последний раз редактировалось gl00mie; 22.02.2023 в 17:04.
За это сообщение автора поблагодарили: Logger (5).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Бюджетирование AX2012 RU2- контроль нескольких бюджетов mnt_dx DAX: Функционал 4 11.12.2015 12:56
kurthatlevik: DAX2012 R3 – Playing with Retail CRT Blog bot DAX Blogs 0 21.05.2015 15:11
DAX2012 - перепоставки по закупкам Starling DAX: Функционал 2 18.03.2014 13:56
Контроль даты поставки + Авторезервирование kart DAX: Функционал 0 21.07.2011 11:44
Контроль серийных номеров и сторно закупки, по которой нет остатка Starling DAX: Функционал 6 01.02.2011 14:55
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 09:41.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.