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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.03.2016, 14:27   #1  
Corel is offline
Corel
Участник
Ex AND Project
 
73 / 15 (1) ++
Регистрация: 19.04.2007
setConnection для прямых запросов на SQL
Есть такая вещь, как setConnection() - устанавливает отдельное соединение для запроса к таблице, которое существует изолированно от основной транзакции. Например, так работает выделение номеров в NumberSquenceTable.

Вопрос: а можно как-то в отдельном соединении запустить executeQuery()? Возможно, надо просто как-то по-другому инициализировать Connection?

X++:
ResultSet get(str _sql)
{
    ResultSet rs;
    Connection con = new Connection();
    ;

    new SqlStatementExecutePermission(_sql).assert();
    rs = con.createStatement().executeQuery(_sql);
    CodeAccessPermission::revertAssert();
    return rs;
}
P.S. речь про 2009

Последний раз редактировалось Corel; 17.03.2016 в 14:45.
Старый 17.03.2016, 14:35   #2  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
SysOperation запустить ассинхронно?

Какую проблему решить пытаетесь?
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0
Старый 17.03.2016, 14:58   #3  
Corel is offline
Corel
Участник
Ex AND Project
 
73 / 15 (1) ++
Регистрация: 19.04.2007
SysOperation - оно для 2012 же только? Тогда не годится.
Задача - вставить значение, полученное во время работы кода, в отдельную таблицу на SQL. Значение обычно получается в глубинах транзакций, а вставить в эту отдельную таблицу пытаются часто и разные АОСы. Поэтому нередки ситуации, когда во время работы долгой обработки, которая дошла до этой вставки, сделала её и пошла дальше, все остальные процессы, которые хотят сделать такую же вставку, вынуждены ждать завершения этой обработки.
Старый 17.03.2016, 19:34   #4  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Скорее всего на таблице отсутствует уникальный индекс и при вставке записи в нее она блокируется целиком.

PS. Желателен даже Primary Index.
Старый 22.03.2016, 11:37   #5  
Corel is offline
Corel
Участник
Ex AND Project
 
73 / 15 (1) ++
Регистрация: 19.04.2007
Хм, разве это так работает? На таблице индекса вообще нет, да и нужен ли, если идёт только вставка?
И всё же, если вернуться к изначальному вопросу: возможно ли эту операцию (вызов SQL-запроса) оформить изолированной транзакцией?
Или вызов SQL-запроса через Statement.executeQuery() и так изолирован и действительно дело в блокировке все таблицы при любой вставке?
Старый 22.03.2016, 17:54   #6  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Что бы победить врага, его нужно сначала найти.
Проблемы блокировок разбирались на этом форуме кучу раз.
Когда вы найдете таблицу, на которой все стопорится, то это уже будет уже пол дела.

Если у вас есть серьезные основания подозревать, что блокировка происходит именно на скулевой-неАХ табличке, то сделайте джоб со вставкой в нее и с помощью двух клиентских сессий проверьте это. Для этого в одной сессии прямо на ttscommit ставите брэк-поинт в джобе, запускаете его и он останавливается, а в другой пытаетесь выполнить джоб целиком. Результат ?

Последний раз редактировалось Alexius; 22.03.2016 в 18:17.
Старый 22.03.2016, 18:34   #7  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Corel Посмотреть сообщение
И всё же, если вернуться к изначальному вопросу: возможно ли эту операцию (вызов SQL-запроса) оформить изолированной транзакцией?
Возможно, конечно. Вы код в номерной серии внимательно посмотрели? xRecord.setConnection() указывает, что с этой табличной переменной надо работать через ранее созданное другое соединение. Т.е. соединение сначала надо все-таки создать. Внимательно посмотрите как создается это новое соединение. Через какой класс.

Есть 3 типа создаваемых соединений. 3 класса

Connection - "поднимает" текущее, уже существующее соединение
UserConnection - создает новое соединение, но с реквизитами существующего
ODBCConnection - создает новое соединение по указанным реквизитам


Цитата:
Сообщение от Corel Посмотреть сообщение
Или вызов SQL-запроса через Statement.executeQuery() и так изолирован и действительно дело в блокировке все таблицы при любой вставке?
Зависти от используемого типа соединения. Собственно, давно бы уже проверили Сценарий теста Вам уже подсказали.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: gl00mie (2).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
SimpleQueryBuilder - простой Х++ конструктор читабельных T-SQL запросов Ruff DAX: Программирование 18 04.02.2016 14:15
emeadaxsupport: AX Performance - Analyzing key SQL Server configuration and database settings Blog bot DAX Blogs 0 28.09.2015 14:11
DAX 2009 - Трассировка долгих SQL-запросов в пакетном режиме N.D.P. DAX: Администрирование 4 18.03.2015 09:13
emeadaxsupport: AX Performance Troubleshooting Checklist Part 1A [Introduction and SQL Configuration] Blog bot DAX Blogs 0 05.09.2014 21:11
Просмотр SQL запросов к БД с помощью файла Log Anton Sk. DAX: База знаний и проекты 3 25.01.2002 16:31
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:56.