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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.07.2011, 14:52   #1  
ashu is offline
ashu
MCTS
MCBMSS
 
255 / 78 (3) ++++
Регистрация: 24.06.2008
update in salesTable
Добрый день коллеги.
я не программист потому: пишу в курилке, могу не верно формулировать- больно не бить. есть простой джобик:
X++:
static void Job64(Args _args)
{
    SalesTable      salesTable;

    ;
    salesTable.selectForUpdate(true);

    select firstOnly salesTable;

    salestable.driver_W   = 'ssss2';

    salesTable.update();

    info(salesTable.SalesId);
внимание вопрос: должен ли отработать?
если да то почему? если нет то почему? а по факту как у вас получилось? на какой версии системы?
За это сообщение автора поблагодарили: mazzy (2).
Старый 03.07.2011, 15:37   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
перенес в программирование.

в ax3.0 и более ранних - сработает.
в ax4.0 и более поздних - не сработает, поскольку потребует обязательной транзакции.

если вопрос не про ttsbegin, а про "можно ли писать selectForUpdate(ture) вместо select forupdate"
то можно писать selectForUpdate(ture)
__________________
полезное на axForum, github, vk, coub.
Старый 03.07.2011, 15:40   #3  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,508 / 432 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Цитата:
Сообщение от mazzy Посмотреть сообщение
в ax3.0 и более ранних - сработает.
в ax4.0 и более поздних - не сработает, поскольку потребует обязательной транзакции.
А разве не наоборот? В 3.0 точно не отработает без открытой транзакции
__________________
С уважением,
Вячеслав
Старый 03.07.2011, 15:41   #4  
ashu is offline
ashu
MCTS
MCBMSS
 
255 / 78 (3) ++++
Регистрация: 24.06.2008
Цитата:
Сообщение от mazzy Посмотреть сообщение
перенес в программирование.

в ax3.0 и более ранних - сработает.
в ax4.0 и более поздних - не сработает, поскольку потребует обязательной транзакции.

если вопрос не про ttsbegin, а про "можно ли писать selectForUpdate(ture) вместо select forupdate"
то можно писать selectForUpdate(ture)
dax 2009 ru4,5,6 срабатывает...
Сергей, есть возможномость проверить на практике?
Старый 03.07.2011, 15:48   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
хм... да, был не прав.

ax3.0 - требует транзакции
ax2009 - срабатывает
Миниатюры
Нажмите на изображение для увеличения
Название: ax3.0.PNG
Просмотров: 336
Размер:	25.1 Кб
ID:	6977   Нажмите на изображение для увеличения
Название: ax2009.PNG
Просмотров: 417
Размер:	51.5 Кб
ID:	6978  

__________________
полезное на axForum, github, vk, coub.
Старый 03.07.2011, 15:50   #6  
ashu is offline
ashu
MCTS
MCBMSS
 
255 / 78 (3) ++++
Регистрация: 24.06.2008
"радует" что не только у нас такая ситуация.
потому и вопрос: Почему срабатывает? в чем сакральное различие мжеду версиями системы, ядра, БД? хочу понять баг или фича, по моему апдейт без тразакции - это не бестпрактикс...

PS добавлю, например на таблице custtable аналогичный джоб не отрабатывает, может быть свойста таблицы?, типа кеширования?, настройки СУБД?- вообщем загадка, давайте коллективным разумом разберемся- жуть как интересно стало...

Последний раз редактировалось ashu; 03.07.2011 в 16:15.
Старый 03.07.2011, 20:06   #7  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,508 / 432 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
в своё время мне рассказывали, что, начиная с 4.0, транзакция на таблице открывается по умолчанию при выборе forupdate и закрывается после обновления. Мол, это сделано для того, чтобы не плодить вложенные открытия/закрытия транзакций.
Мне лично это кажется неудачным решением. Зачастую под транзакцией надо понимать обновление не только конкретной таблицы, но и связанных с ней. Не уверен, что можно корректно вычленить такие изменения, если транзакцию надо откатить, а её границы в явном виде не указаны.
__________________
С уважением,
Вячеслав

Последний раз редактировалось pitersky; 03.07.2011 в 20:17.
Старый 03.07.2011, 22:25   #8  
shlyopin is offline
shlyopin
MCTS
MCBMSS
 
21 / 14 (1) ++
Регистрация: 05.09.2005
Адрес: Россия
Добрый вечер! Смею предположить, что дело в оптимистической модели данных включённой по умолчанию для этой таблицы (OCC Enabled = Yes) для версии AX 5.0. Если ее отключить, то результат без обрамленной транзакции будет: Невозможно отредактировать запись в Заказы на продажу (SalesTable). Невозможно выполнить операторы NEXT, update() или delete() с буфером, данные которого выбраны или вставлены в рамках другой транзакции. (Проверял на 5.0 1500 3761)

Последний раз редактировалось shlyopin; 03.07.2011 в 22:28.
За это сообщение автора поблагодарили: S.Kuskov (2), ashu (1).
Старый 03.07.2011, 23:07   #9  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Угум.
А еще наличие вызова ttsbegin/ttscommit ВНУТРИ метода update() "помогает" при включенной оптимистической конкуренции. Без это тоже будет исключение (сравните с вызовом doUpdate())
__________________
Axapta v.3.0 sp5 kr2
Старый 04.07.2011, 08:17   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от AndyD Посмотреть сообщение
Угум.
А еще наличие вызова ttsbegin/ttscommit ВНУТРИ метода update() "помогает" при включенной оптимистической конкуренции. Без это тоже будет исключение (сравните с вызовом doUpdate())
Если транзакцию начинать уже после выбора записи, то возможны исключения типа. "Запись не может быть сохранена. Запись была изменена другим пользователем"

А какова вообще может быть причина идти на риск редактирования записи не открывая заранее транзакцию? Когда такое может пригодиться?
Старый 04.07.2011, 09:39   #11  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
При оптимистической конкуренциии в DAX2009 что с транзакцией, что без нее выборка с forupdate (или с selectForUpdate(true)) не накладывает блокировки на выбираемые данные (при записи выполняется операция update ... where ... recVersion=[считанное ранее значение] и, если данные успели поменяться со времени последнего чтения и обновление не проходит, будет выброшено исключение "Запись удалена или изменена другим пользователем).

Так что, с точки зрения DAX2009, наличие транзакции в этом режиме при операции чтения никак не скажется на логике выполнения вышеприведенного кода (если только update выполняется внутри транзакции, конечно)
__________________
Axapta v.3.0 sp5 kr2
 

Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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