|
|
|
|
#1 |
|
Участник
|
Цитата:
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 |
|
|
|
|
#2 |
|
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 |
|
|
|
|
#3 |
|
Участник
|
Если человек знает про эту особенность, то он ничего не ожидает, а просто держит ее в голове
![]() X++: TempDummyTable t; ; t.ttsbegin; t.Field1="1"; t.Field2="2"; t.insert(); t.Field1="1"; t.Field2="4"; t.insert(); t.ttscommit;
|
|
|
|
|
#4 |
|
MCITP
|
Цитата:
Ну во первых это не был полный пример кода, а не более чем шаблон, в первую очередь с упором на синтаксис. ![]() А во вторых, даже если считать это законченным примером, в случае ошибки при втором инсерте ввиду отсутствия обработчика ошибок функция завершится с ошибкой и область видимости временной табличной переменной закончится автоматически, поэтому "первый инсерт" ни фига ни разу там не останется. ![]() Но а вообще, конечно да, основная причина использования транзакций для временных таблиц - это именно откат (t.ttsAbort) в случае необходимости, а не фиксация... Я так понял вы это, в частности, хотели подчеркнуть? Тема ушла в офтоп...
__________________
Zhirenkov Vitaly |
|
|
|
|
#5 |
|
Участник
|
Цитата:
p.s. Знатный оффтопик получился
|
|
|
| Теги |
| временная таблица, транзакции |
|
|
Похожие темы
|
||||
| Тема | Ответов | |||
| И снова Query и временные таблицы | 19 | |||
| Временные таблицы в отчете | 25 | |||
| Временные таблицы в отчетах | 5 | |||
| Временные таблицы | 6 | |||
| Временные таблицы в запросе | 4 | |||
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|