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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.03.2012, 12:37   #1  
Андрей К. is offline
Андрей К.
Постигающий
 
152 / 10 (1) +
Регистрация: 09.04.2007
можно ли поймать остановку выполнения кода из дебаггера?
Всем здрасти!
задача такая
выполняется программа:

X++:
{
ttsBegin;
//<наполнение таблицы>
ttsCommit;
ttsBegin;
//<какой-то код, который должен выполняться за рамками предыдущей транзакции>

//<--------------------------остановка выполнения из дебаггера (программист дернул стоп-кран)

//<очистка таблицы>
ttsCommit;
}
как очистить таблицу если программист дернул стоп-кран перед запуском ее очистки в программе?
Старый 22.03.2012, 12:49   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,232 / 1594 (60) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Не очень понял вопрос. Вы хотите в момент отладки программы влиять на ход её выполнения? На сколько я знаю через отладчик можно менять значения переменных базовых типов. Это наверное можно как-то использовать. Или ваш вопрос как-то связан с особенностями работы транзакций? Можно поподробнее что и для чего вы делаете?
Старый 22.03.2012, 12:53   #3  
Андрей К. is offline
Андрей К.
Постигающий
 
152 / 10 (1) +
Регистрация: 09.04.2007
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Не очень понял вопрос. Вы хотите в момент отладки программы влиять на ход её выполнения? На сколько я знаю через отладчик можно менять значения переменных базовых типов. Это наверное можно как-то использовать. Или ваш вопрос как-то связан с особенностями работы транзакций? Можно поподробнее что и для чего вы делаете?
на программу влиять не хочу. я просто предоставил вам схематично вид моей программы и поведение разработчика, который наблюдает за ее выполнением в отладчике. он может прервать ее выполнение по каким то своим соображениям и причинам. после этого логика выполнения нарушится, так как не произойдет очистка таблицы. нам эта очистка очень нужна.
Старый 22.03.2012, 12:59   #4  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
256 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
а вынести очистку таблицы за переделы этой транзакции нельзя, поместив очистку в отдельную транзакцию или в отдельный метод?
__________________
С уважением, Александр.
Старый 22.03.2012, 13:01   #5  
Андрей К. is offline
Андрей К.
Постигающий
 
152 / 10 (1) +
Регистрация: 09.04.2007
Подробно о программе:
она выполняет определенную бизнес-логику.
в первой транзакции мы заполняем таблицу лога. если в таблице лога есть запись, то другие пользователи не могут запустить эту бизнес-логику со своей машины, а чтобы данные о логе попадали в общую бд и сразу были "видны" всем юзерам, мы используем для заполнения лога отдельную транзакцию. Далее выполняется бизнес-логика. и по завершении мы должны почистить лог, чтобы другие пользователи получили возможность запускать нашу бизнес-логику
Старый 22.03.2012, 13:02   #6  
Андрей К. is offline
Андрей К.
Постигающий
 
152 / 10 (1) +
Регистрация: 09.04.2007
Цитата:
Сообщение от samolalex Посмотреть сообщение
а вынести очистку таблицы за переделы этой транзакции нельзя, поместив очистку в отдельную транзакцию или в отдельный метод?
а разве третья транзакция будет выполняться , если мы прервем работу программы во второй транзакции?
Старый 22.03.2012, 13:03   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,232 / 1594 (60) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Андрей К. Посмотреть сообщение
он может прервать ее выполнение по каким то своим соображениям и причинам. после этого логика выполнения нарушится, так как не произойдет очистка таблицы. нам эта очистка очень нужна.
А можно спросить, почему транзакций две а не одна? И почему вы делаете упор именно на работу в отладчике? Ведь может и просто свет выключиться, сбой оборудования или ещё что, мало ли причин для отката транзакции.

Цитата:
Сообщение от Андрей К. Посмотреть сообщение
а чтобы данные о логе попадали в общую бд и сразу были "видны" всем юзерам, мы используем для заполнения лога отдельную транзакцию
Если проблема только в этом, то сделать это можно и не прерывая основную транзакцию в параллельном соединении.

Последний раз редактировалось S.Kuskov; 22.03.2012 в 13:06.
Старый 22.03.2012, 13:06   #8  
Андрей К. is offline
Андрей К.
Постигающий
 
152 / 10 (1) +
Регистрация: 09.04.2007
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Если проблема только в этом, то сделать это можно и не прерывая основную транзакцию в параллельном соединении.
киньте в меня ссылкой пожалуйста
Старый 22.03.2012, 13:08   #9  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
256 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Цитата:
Сообщение от Андрей К. Посмотреть сообщение
а разве третья транзакция будет выполняться , если мы прервем работу программы во второй транзакции?
так по сути можно прервать работу первой транзакции, тогда не начнет выполняться и вторая. может лучше для данного лога использовать временную таблицу, класс struct или map, если у Вас лог динамичный и все равно чистится?
__________________
С уважением, Александр.
Старый 22.03.2012, 13:10   #10  
Андрей К. is offline
Андрей К.
Постигающий
 
152 / 10 (1) +
Регистрация: 09.04.2007
Цитата:
Сообщение от samolalex Посмотреть сообщение
так по сути можно прервать и работу первой транзакции, тогда и не начнет выполняться вторая. может лучше для данного лога использовать временную таблицу, класс struct или map, если у Вас лог динамичные и все равно чистится?
как другие пользователи увидят содержимое тмп таблицы или map? данные о логе должны быть доступны всем и сразу и до того как начинает выполняться бизнеслогика. поэтому первая транзакция закрывается и открывается вторая
Старый 22.03.2012, 13:10   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,232 / 1594 (60) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Андрей К. Посмотреть сообщение
киньте в меня ссылкой пожалуйста
Параллельная транзакция
За это сообщение автора поблагодарили: Андрей К. (1), samolalex (1).
Старый 22.03.2012, 13:14   #12  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
256 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Цитата:
Сообщение от Андрей К. Посмотреть сообщение
как другие пользователи увидят содержимое тмп таблицы или map? данные о логе должны быть доступны всем и сразу и до того как начинает выполняться бизнеслогика. поэтому первая транзакция закрывается и открывается вторая
да, упустил этот момент.
__________________
С уважением, Александр.
Старый 22.03.2012, 13:18   #13  
Андрей К. is offline
Андрей К.
Постигающий
 
152 / 10 (1) +
Регистрация: 09.04.2007
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
то есть будет так:

X++:
{
ttsBegin;
userConnection.ttsbegin();
//<заполняем лог>
userConnection.ttscommit();
//<бизнес логика>

//<----------------------------------если в этот момент происходит отключение электричества, 
// то все , что мы наинсертили в паралллельной транзакции откатится?

//<очищаем лог>
ttsCommit;
}
Старый 22.03.2012, 13:21   #14  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,232 / 1594 (60) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Тьфу. Только сейчас до меня дошло что именно вы пытаетесь реализовать. Блокировка запуска кода несколькими пользователями одновременно. Так?

Цитата:
Сообщение от Андрей К. Посмотреть сообщение
чтобы данные о логе попадали в общую бд и сразу были "видны" всем юзерам
Нет. Это делается по другому. Например, в той же таблице с логом оставьте одну запись. Эту запись внутри транзакции выбирайте для обновления и перед окончанием транзакции обновляйте. Тогда второй пользователь не сможет сделать тоже самое ровно до тех пор пока первый не освободит эту единственную запись.
Старый 22.03.2012, 13:30   #15  
Андрей К. is offline
Андрей К.
Постигающий
 
152 / 10 (1) +
Регистрация: 09.04.2007
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Тьфу. Только сейчас до меня дошло что именно вы пытаетесь реализовать. Блокировка запуска кода несколькими пользователями одновременно. Так?

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

ну то есть вася пупкин запустил программу с параметром А, в лог попала строка со значением А. это значит что никто не может запускать программу с параметром А, пока вася пупкин не закончит и не очистит лог.

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

Последний раз редактировалось Андрей К.; 22.03.2012 в 13:33.
Старый 22.03.2012, 13:46   #16  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,232 / 1594 (60) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Андрей К. Посмотреть сообщение
ну то есть вася пупкин запустил программу с параметром А, в лог попала строка со значением А. это значит что никто не может запускать программу с параметром А, пока вася пупкин не закончит и не очистит лог.
Заведите в логе галку "заблокировано". Вместо заполнения и чистки лога снимайте и устанавливайте эту галку (делайте это внутри одной транзакции, как я описывал выше). Перед тем как начать транзакцию проверяйте есть ли в таблице строка с нужным параметром, если нет, то создавайте. На всякий случай задайте на таблице уникальный индекс, чтобы нельзя было создать две строчки с одним и тем же параметром.
Старый 22.03.2012, 14:54   #17  
Андрей К. is offline
Андрей К.
Постигающий
 
152 / 10 (1) +
Регистрация: 09.04.2007
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Заведите в логе галку "заблокировано". Вместо заполнения и чистки лога снимайте и устанавливайте эту галку (делайте это внутри одной транзакции, как я описывал выше). Перед тем как начать транзакцию проверяйте есть ли в таблице строка с нужным параметром, если нет, то создавайте. На всякий случай задайте на таблице уникальный индекс, чтобы нельзя было создать две строчки с одним и тем же параметром.
ну установлю я галку в транзакции, ее же никто не увидит, пока мы транзакцию не закроем(не доведем программу до логического конца). а если отметить ее в параллельной транзакции(или в отдельной последовательной), то при выключении света мы ее не сможем откатить в неотмеченное состояние.
Старый 22.03.2012, 15:11   #18  
Alexanderis.ua is offline
Alexanderis.ua
Участник
 
53 / 40 (2) +++
Регистрация: 25.12.2008
Адрес: Киев, Украина
Может посмотреть в сторону блокировки журналов? Там ведь при разноске тоже блокировка устанавливается.

Подробностей сейчас не вспомню - давненько смотрел, но общая идея

1. Заблокировать лог (не галочкой, а идентификатором сессии запустившего).
2. Открыть транзакцию,
3. выполнить логику
4. закрыть транзакцию,
5. снять блокировку

А при проверке блокировки лога смотреть, а существует ли еще такая сессия. Если нет - блокировку считать недействительной. Тогда выключение электричества не помешает.
__________________
If it ain't broke, take it apart and find out why (с)
Старый 22.03.2012, 15:26   #19  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,232 / 1594 (60) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Андрей К. Посмотреть сообщение
ну установлю я галку в транзакции, ее же никто не увидит, пока мы транзакцию не закроем
И не нужно. Главное - это то, что другой процесс не сможет уже выбрать/обновить эту запись пока она выбрана для обновляется в другой транзакции.

Как принудительно создать блокировку?
Старый 22.03.2012, 17:55   #20  
Pustik is offline
Pustik
Участник
 
799 / 361 (14) ++++++
Регистрация: 04.06.2004
Может подойти класс Tread. Поскольку Вам все равно нужно чистить таблицу вне зависимости выполнилась ли бизнесс-логика или нет, то конструкцию можно организовать на примере следующего джоба :
X++:
static void Job620(Args _args)
{
   Thread bpt; // поток для бизнесс-процесса
   Thread clt; //  поток для удаления таблицы

   bpt = new Thread();
   clt = new Thread();

   bpt.setInputParm(connull()); // передача параметров потоку для бизнесс-процесса
   // запуск
   bpt.run( classnum( TestClassThread),staticmethodstr(TestClassThread,BuisnessProcess));
   bpt.waitUntilSignaled(); // ожидание завершения БП

   clt.setInputParm(connull()); /      
   clt.run( classnum( TestClassThread ), staticmethodstr(TestClassThread,ClearTable)); // чистка
   clt.waitUntilSignaled(); // ожидание завершения чистки
}
Потоки запускаются в разных сессиях, поэтому друг другу не мешают. Т.е. один поток не будет зависить от ошибки другого ( даже того же throw error()) А
X++:
bpt.waitUntilSignaled();
не даст очистить таблицу раньше времени. Для тестирования можете создать класс TestClassThread как указан в джобе и написать там 2 статических метода :
X++:
server static void BuisnessProcess(Thread t)
{
   container con = t.getInputParm();
   ;
   // выполнение бизнесс процесса

   // выполнение бизнесс процесса
   throw error('Ошибка');
}
X++:
server static void ClearTable(Thread t)
{
   container con = t.getInputParm();
   ;
   // очистка таблицы

   // очистка таблицы
   info('ClearTable');
}
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.

Последний раз редактировалось Pustik; 22.03.2012 в 18:01.
За это сообщение автора поблагодарили: Андрей К. (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Масштабируемость AOS'а AX 2009 и принципы выполнения кода клиентских сессий на сервере gl00mie DAX: Администрирование 27 28.05.2013 17:40
Перенос точки выполнения в отладчике DAX2009 Bega DAX: Программирование 3 21.02.2011 15:21
axforum blogs: Можно ли снизить стоимость внедрения ERP-системы? Blog bot DAX Blogs 0 11.02.2011 15:11
Ускорение выполнения запроса Oracle + MS Axapta Горбунов Дмитрий DAX: Программирование 17 15.11.2005 18:13
Как можно управлять элементом Grid из кода? vitk DAX: Программирование 4 26.08.2004 16:02
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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