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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.11.2021, 12:47   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,972 / 3268 (116) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
А вы не могли бы попробовать провести эксперимент.

ttsBegin / ttsCommit
методы есть на самом табличном буфере(в частности при работе с времянками in memory лучше использовать их)

попробуйте в методе Write задействовать не обычный ttsbegin / commit а одноименные методы на буфере датасорса.

Есть подозрение что для работы датасорса формы ядро у вас использовало отдельное соединение к базе и при выбросе исключения откатило именно транзакцию открытую в этом соединении. А основную транзакцию в дефолтном соединении, которую вы открыли написав ttsBegin - не откатило.

Вот хотелось бы чтобы там был try catch и в catch проверить открыта ли транзакция на соединении связанном с буфером датасорса (я правда на все 100 не уверен что это отдельное соединение - вот и проверим). Как проверить уровень транзакции - Напрямую на табличном буфере методов нет. Но можно попробовать вызвать tableBuffer.ttsCommit() в цикле со счетчиком. Если уровень транзакции 0 то вызов должен по идее выругаться.
Старый 02.11.2021, 15:02   #2  
Perc is offline
Perc
Участник
 
194 / 57 (2) ++++
Регистрация: 05.03.2005
Цитата:
Сообщение от Logger Посмотреть сообщение
А вы не могли бы попробовать провести эксперимент...
Эмм.. все это странные версии.. ну пусть))
Замена ttsBegin на LedgerJournalTable.ttsbegin() не изменила в поведении ничего абсолютно. Так же вижу в отладчике уровень 1, также журнал создается разносится и при выходе из акс теряется.
try catch куда вставлять не понятно. Потому как я уже писал - стоит tts завернуть в try и тогда все корректно откатывается. Вот так работает нормально
X++:
try {
  ttsbegin;
  super();
  journalFormTable.datasourceWritePost();
  ttscommit;
}
catch {}
Единственно вопрос остался для меня открытым.
Нашей Акс4 сто лет в обед. В функциональности около журнала какбудто ничо не меняется столько же лет. Люди те же, с таким же стажем. Но жалобы характерные начались несколько месяцев назад.
Вот и думаю не может быть связано изменение поведения с админской частью? Сервера винды, SQL, терминалы - обновляют регулярно. не могло с этой стороны подвох прийти?
Есть еще у когото четверка живая? )
Старый 02.11.2021, 15:44   #3  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
877 / 649 (23) +++++++
Регистрация: 14.10.2004
Данные на формах редактируются в другом UserConnection. Когда вы смотрите в Аксапте активных пользоватей, то для тех, кто работает с формами, видно два разных SPID.
Метод write на датасурсе формы использует один UserConnection. А когда вы пишете в коде ttsbegin - ttscommit, то это применяется ко второму UserConnection. Поэтому когда внутри write выскакивает ошибка, то откатывается транзакция того UserConnection, который дла формы. А для того UserConnection'а, для которго написан в коде ttsbegin - для того транзакция не откатывается. И поэтому ttsLevel не сбрасывается.
А try - catch сбрасывает ttsLevel для того ttsbegin, который написан внутри кода для вашего UserConnection.
Этим самым и отличаюстя write на источнике данных формы от write на обычной табличной переменной. Ваш ttsbegin-ttscommit не действует на источник данных формы.
Если убрать try-catch, то выполнение кода внутри метода write источника данных сразу же прекращается, и не доходит до вызова ttscommit.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/

Последний раз редактировалось Ace of Database; 02.11.2021 в 15:59.
За это сообщение автора поблагодарили: Pandasama (2).
Старый 03.11.2021, 06:30   #4  
Perc is offline
Perc
Участник
 
194 / 57 (2) ++++
Регистрация: 05.03.2005
Цитата:
..Ваш ttsbegin-ttscommit не действует на источник данных формы..
Интересная теория вполне имеющая под собой основания. Даже если и так, то разработчики от нас явно это хотят скрыть и согласуют транзакции в разных коннектах..
Есть ли у вас пример где эта теория железобетонно подтверждается?

У меня есть такой контрпример, что не все так однозначно..
есть два джоба - ttsbegin и ttsabort. есть тестовая форма с таблицей. Ни на таблице ни на форме нет ни одного метода - кода нет вообще. Ну а дальше вы уже догадались..
1. запускаю форму
2. запускаю джоб ttsbegin
3. в форме заполняю поля записи и закрываю ее. Снова открываю - запись на месте. Закрываю.
4. Запускаю джоб ttsAbort
5. Открываю форму. Записи введенной на шаге 3 больше нет

Как это объясняет теория об отдельной жизни форм?

Последний раз редактировалось Perc; 03.11.2021 в 06:40.
Старый 04.11.2021, 19:48   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,713 / 1201 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Perc Посмотреть сообщение
Интересная теория вполне имеющая под собой основания. Даже если и так, то разработчики от нас явно это хотят скрыть и согласуют транзакции в разных коннектах..
Не уверен. Но, вроде бы, в dax4 генерацию новых значений номерных серий делали в отельном соединении. Может, проблема связана с номерными сериями?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 06.11.2021, 19:24   #6  
Perc is offline
Perc
Участник
 
194 / 57 (2) ++++
Регистрация: 05.03.2005
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Не уверен.
В чем не уверены? Я свой пример привел.
С вашей стороны есть проверяемый пример подтверждающий обратное? или что имели ввиду
Цитата:
Но, вроде бы, в dax4 генерацию новых значений номерных серий делали в отельном соединении. Может, проблема связана с номерными сериями?
Ну мы же уже попробовали "голую" форму с "голой" таблицей. Какие там номерные серии? Их нет.. ну разве что recid.. Да он то тут причем?
Старый 07.11.2021, 19:01   #7  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1296 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от Perc Посмотреть сообщение
В чем не уверены?
Я так думаю, что Владимир Максимов не уверен в теории, высказанной Ace of Database об отдельном соединении пр работе датасорса формы.

Я тоже в ней не очень уверен - пока не встречался ни с одним кейсом подтверждения такой теории (ну кроме работы с номерными сериями, но это совсем другой кейс).

Вот то что Аксапта при сохранении данных датасорса формы вообще не открывает явную транзакцию в MS SQL еще могу предположить (опять же только предположить) - работает неявная транзакция MS SQL. Понятно, что обязательность поля контролируется не на уровне MS SQL, а движком и сам движок выдает исключение, сам же его и перехватывает.

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

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

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
ttsbegin и зацикливание While select Perc DAX: Программирование 4 21.11.2014 08:55
Win2008 и вызов методов COM-объектов AndyD DAX: Программирование 13 06.02.2012 15:22
Падает стандартный импорт с ошибкой "Вызов ttscommit без вызова ttsbegin" skof DAX: Администрирование 6 19.01.2012 17:12
dynamics-ax-dev: CLR Errors & ttsbegin/ttscommit Blocks Blog bot DAX Blogs 0 02.11.2010 18:05
ttsbegin ttscommit and changecompany() Volodymyr DAX: Программирование 9 29.08.2008 15:36

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

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

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