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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.10.2009, 10:04   #1  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
Временные таблицы и транзакции
--- Модератор: перенесено из Group by и временная таблица ---

Немного оффтопика, просто в глаза бросилось:

Цитата:
Сообщение от Varmen Посмотреть сообщение
ну и под занавес, мой любимый RecId itd
X++:
static void Job10(Args _args)
{
 TempDummyTable t;
 ;
ttsbegin;
   t.Field1="1";
   t.Field2="2";
   t.insert();
ttscommit;
ttsbegin;
   t.Field1="1";
   t.Field2="4";
   t.insert();
ttscommit;
Временным таблицам фиолетово на транзакции, так что если у вас в коде идут операции только над ними, то транзакции лишние. Даже если и случится исключение, то перехватив его ссылка на временную таблицу будет содержать все то, что в нее записали.

p.s. Во всяком случае в трешке, в четверке не проверял, хотя вероятней всего оно везде едино.

Последний раз редактировалось Dron AKA andy; 13.10.2009 в 14:25.
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 13.10.2009, 10:39   #2  
egorych is offline
egorych
Участник
Самостоятельные клиенты AX
Oracle
 
761 / 154 (7) ++++++
Регистрация: 09.11.2006
Адрес: Краснодарский край
Цитата:
Сообщение от Lemming Посмотреть сообщение
Временным таблицам фиолетово на транзакции, так что если у вас в коде идут операции только над ними, то транзакции лишние.
Да и вообще в данном случае транзакция на insert ИМХО лишняя. Если вставлять несколько зависимых строк в разные таблицы, то да, а на 1 таблицу...
Старый 13.10.2009, 10:52   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Lemming Посмотреть сообщение
Временным таблицам фиолетово на транзакции, так что если у вас в коде идут операции только над ними, то транзакции лишние. Даже если и случится исключение, то перехватив его ссылка на временную таблицу будет содержать все то, что в нее записали.
Видимо это связано со способом их хранения в файловом виде. Мы же не ожидаем что помещённые в файл данные при откате транзакции вернутся обратно. Вот так и со временными таблицами
Старый 13.10.2009, 11:04   #4  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Lemming Посмотреть сообщение
Немного оффтопика, просто в глаза бросилось:

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

p.s. Во всяком случае в трешке, в четверке не проверял, хотя вероятней всего оно везде едино.
Наверное нужно уточнить, что для них "фиолетово" обычные операторы транзакции. Они действительно работают только для таблиц, "замапленных" в БД.
Но для временных таблиц можно (и часто нужно) сделать свою транзакцию посредством вызовов соответсвующих методов на табличном буффере.
Т.е. вышеуказанный пример правильнее было бы написать так:
X++:
 TempDummyTable t;
 ;
t.ttsbegin;

   t.Field1="1";
   t.Field2="2";
   t.insert();

   t.Field1="1";
   t.Field2="4";
   t.insert();

t.ttscommit;
(Вроде раньше писал уже как-то об этом, но не смог найти тему, к сожалению)

UPD нашёл таки
__________________
Zhirenkov Vitaly
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 13.10.2009, 11:18   #5  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
?
Цитата:
Сообщение от ZVV Посмотреть сообщение
Но для временных таблиц можно (и часто нужно) сделать свою транзакцию посредством вызовов соответсвующих методов на табличном буффере.
X++:
static void TmpTableTTSTest(Args _args)
{

    TmpABC  tmpABC;
    ;

    try
    {
        tmpABC.ttsbegin();
        tmpABC.ItemId = "Test1";
        tmpABC.RefRecId = 1;
        tmpABC.insert();

        tmpABC.ItemId = "Test2";
        tmpABC.RefRecId = 2;
        tmpABC.insert();

        while select forupdate tmpABC
        {
            tmpABC.ItemId = tmpABC.ItemId + "upd";
            tmpABC.update();
        }

        throw error("Throw");

        tmpABC.ttscommit();
    }
    catch
    {
        while select tmpABC
        {
            info(tmpABC.ItemId);
        }
    }
}
Результат:

Throw
Test1upd
Test2upd

Я как-то не так юзаю соответствующие методы табличного буфера?

upd: Ну да, с ручным абортом работает, но только это не совсем то.

Последний раз редактировалось Lemming; 13.10.2009 в 11:25. Причина: upd
Старый 13.10.2009, 11:25   #6  
Varmen is offline
Varmen
Участник
 
190 / 13 (1) ++
Регистрация: 02.10.2007
временным таблицам фиолетово, зато когда таблица превратилась в не временную, код продолжает работать (я тестировал с измененим этого признака).
Тема все таже избыточно что то написали, выиграли в устойчивости.
__________________
The Variable men power.

Последний раз редактировалось Varmen; 13.10.2009 в 11:27.
Старый 13.10.2009, 11:29   #7  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Lemming Посмотреть сообщение
X++:
static void TmpTableTTSTest(Args _args)
{

    TmpABC  tmpABC;
    ;

    try
    {
        tmpABC.ttsbegin();
        tmpABC.ItemId = "Test1";
        tmpABC.RefRecId = 1;
        tmpABC.insert();

        tmpABC.ItemId = "Test2";
        tmpABC.RefRecId = 2;
        tmpABC.insert();

        while select forupdate tmpABC
        {
            tmpABC.ItemId = tmpABC.ItemId + "upd";
            tmpABC.update();
        }

        throw error("Throw");

        tmpABC.ttscommit();
    }
    catch
    {
        while select tmpABC
        {
            info(tmpABC.ItemId);
        }
    }
}
Результат:

Throw
Test1upd
Test2upd

Я как-то не так юзаю соответствующие методы табличного буфера?

upd: Ну да, с ручным абортом работает, но только это не совсем то.
Нет, всё работает штатно, а вы ожидали другого результата?
Вы вызвали ошибку, основная транзакция в БД отвалилась, транзакция же на временной таблице висит по прежнему без изменений. Если вам её тоже нужно откатить, нужно вызвать tmpABC.ttsAbort();
__________________
Zhirenkov Vitaly
Старый 13.10.2009, 11:35   #8  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
;)
Цитата:
Сообщение от ZVV Посмотреть сообщение
Нет, всё работает штатно, а вы ожидали другого результата?
Если человек знает про эту особенность, то он ничего не ожидает, а просто держит ее в голове

X++:
TempDummyTable t;
 ;
t.ttsbegin;

   t.Field1="1";
   t.Field2="2";
   t.insert();

   t.Field1="1";
   t.Field2="4";
   t.insert();

t.ttscommit;
В таком случае пример, который Вы привели выше, как правильный, в случае ошибки при втором инсерте транзакции никак не спасают, ибо первый инсерт там останется
Старый 13.10.2009, 11:54   #9  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Lemming Посмотреть сообщение
В таком случае пример, который Вы привели выше, как правильный, в случае ошибки при втором инсерте транзакции никак не спасают, ибо первый инсерт там останется
А, вы в этом смысле...
Ну во первых это не был полный пример кода, а не более чем шаблон, в первую очередь с упором на синтаксис.
А во вторых, даже если считать это законченным примером, в случае ошибки при втором инсерте ввиду отсутствия обработчика ошибок функция завершится с ошибкой и область видимости временной табличной переменной закончится автоматически, поэтому "первый инсерт" ни фига ни разу там не останется.
Но а вообще, конечно да, основная причина использования транзакций для временных таблиц - это именно откат (t.ttsAbort) в случае необходимости, а не фиксация... Я так понял вы это, в частности, хотели подчеркнуть?

Тема ушла в офтоп...
__________________
Zhirenkov Vitaly
Старый 13.10.2009, 12:08   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Итого. Правильный шаблон для работы в транзакции с временными таблицами выгладит так

X++:
    try
    {
        tmpABC.ttsbegin();

        ...
        tmpABC.ttscommit();
    }
    catch
    {
        tmpABC.ttsAbort();
    }
Старый 13.10.2009, 12:15   #11  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Итого. Правильный шаблон для работы в транзакции с временными таблицами выгладит так

X++:
    try
    {
        tmpABC.ttsbegin();

        ...
        tmpABC.ttscommit();
    }
    catch
    {
        tmpABC.ttsAbort();
    }
Так точно.
__________________
Zhirenkov Vitaly
За это сообщение автора поблагодарили: driller (2).
Старый 13.10.2009, 12:16   #12  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
Цитата:
Сообщение от ZVV Посмотреть сообщение
Но а вообще, конечно да, основная причина использования транзакций для временных таблиц - это именно откат (t.ttsAbort) в случае необходимости, а не фиксация... Я так понял вы это, в частности, хотели подчеркнуть?
Признаться, я даже не помню где бы мне явно приходилось вызывать метод ttsabort. Просто я хотел обратить внимание автора, чей код я процитировал своим первым сообщением в этой ветке, что стоит иметь ввиду, несколько неожиданную(ИМХО), особенность транзакций в работе с временными таблицами. Самой фичей равнодушия вр. таблиц к транзакциям, на практике, я воспользовался всего один раз: использовал ее как кэш уже обработанных операций, что бы в случае ошибки не потерять уже готовые транзакции и в обработчике исключения перелить что успел обработать в постоянную таблицу.

p.s. Знатный оффтопик получился
Теги
временная таблица, транзакции

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
И снова Query и временные таблицы Def DAX: Программирование 19 08.12.2006 15:46
Временные таблицы в отчете Прокопьева DAX: Программирование 25 02.10.2006 14:54
Временные таблицы в отчетах konfet DAX: Программирование 5 19.01.2005 11:32
Временные таблицы vasiliy DAX: Программирование 6 09.11.2004 11:04
Временные таблицы в запросе Dron AKA andy DAX: Программирование 4 06.09.2002 12:14

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

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

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