13.10.2009, 10:04 | #1 |
Участник
|
Временные таблицы и транзакции
--- Модератор: перенесено из Group by и временная таблица ---
Немного оффтопика, просто в глаза бросилось: Цитата:
p.s. Во всяком случае в трешке, в четверке не проверял, хотя вероятней всего оно везде едино. Последний раз редактировалось Dron AKA andy; 13.10.2009 в 14:25. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |
13.10.2009, 10:39 | #2 |
Участник
|
|
|
13.10.2009, 10:52 | #3 |
Участник
|
Видимо это связано со способом их хранения в файловом виде. Мы же не ожидаем что помещённые в файл данные при откате транзакции вернутся обратно. Вот так и со временными таблицами
|
|
13.10.2009, 11:04 | #4 |
MCITP
|
Цитата:
Сообщение от 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 |
Участник
|
Цитата:
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 |
Участник
|
временным таблицам фиолетово, зато когда таблица превратилась в не временную, код продолжает работать (я тестировал с измененим этого признака).
Тема все таже избыточно что то написали, выиграли в устойчивости.
__________________
The Variable men power. Последний раз редактировалось Varmen; 13.10.2009 в 11:27. |
|
13.10.2009, 11:29 | #7 |
MCITP
|
Цитата:
Сообщение от 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 |
Участник
|
Если человек знает про эту особенность, то он ничего не ожидает, а просто держит ее в голове
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 |
MCITP
|
Цитата:
Ну во первых это не был полный пример кода, а не более чем шаблон, в первую очередь с упором на синтаксис. А во вторых, даже если считать это законченным примером, в случае ошибки при втором инсерте ввиду отсутствия обработчика ошибок функция завершится с ошибкой и область видимости временной табличной переменной закончится автоматически, поэтому "первый инсерт" ни фига ни разу там не останется. Но а вообще, конечно да, основная причина использования транзакций для временных таблиц - это именно откат (t.ttsAbort) в случае необходимости, а не фиксация... Я так понял вы это, в частности, хотели подчеркнуть? Тема ушла в офтоп...
__________________
Zhirenkov Vitaly |
|
13.10.2009, 12:08 | #10 |
Участник
|
Итого. Правильный шаблон для работы в транзакции с временными таблицами выгладит так
X++: try { tmpABC.ttsbegin(); ... tmpABC.ttscommit(); } catch { tmpABC.ttsAbort(); } |
|
13.10.2009, 12:15 | #11 |
MCITP
|
Так точно.
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: driller (2). |
13.10.2009, 12:16 | #12 |
Участник
|
Цитата:
p.s. Знатный оффтопик получился |
|
Теги |
временная таблица, транзакции |
|
Похожие темы | ||||
Тема | Ответов | |||
И снова Query и временные таблицы | 19 | |||
Временные таблицы в отчете | 25 | |||
Временные таблицы в отчетах | 5 | |||
Временные таблицы | 6 | |||
Временные таблицы в запросе | 4 |
|