|
Ошибка использования транзакции - Транзакция не активна | ☑ | ||
---|---|---|---|---|
0
Gorr
13.03.14
✎
17:26
|
Использую конструкцию
Попытка НачатьТранзакцию(); //здесь формирую и провожу документы программно Исключение ОтменитьТранзакцию();//тут ошибка "Транзакция не активна" КонецПопытки; ЗафикситоватьТранзакцию(); Почему возникает ошибка? как правильно использовать транзакцию совместно с конструкцией попытка? |
|||
1
Maxus43
13.03.14
✎
17:30
|
ЕстьОшибка = Ложь;
Попытка ... Исключение ЕстьОшибка = Истинка; КонецПопытки; Если ЕСтьОшибка Тогда ОтменитьТранзакцию(); Иначе ЗафиксироватьТранзакцию(); КонецЕсли; |
|||
2
Gorr
13.03.14
✎
17:31
|
+ (0)
ЗафиксироватьТранзакцию(); находится перед Исключением |
|||
3
timurhv
13.03.14
✎
17:34
|
(0) ТранзакцияАктивна()
|
|||
4
Добрый хачик
13.03.14
✎
17:35
|
НачатьТранзакцию();
Попытка //здесь формирую и провожу документы программно ... ЗафикситоватьТранзакцию(); Исключение ОтменитьТранзакцию();//тут ошибка "Транзакция не активна" КонецПопытки; |
|||
5
Maxus43
13.03.14
✎
17:36
|
Пихать в попытку команды транзакций - моветон короче, так не работает
|
|||
6
Господин ПЖ
13.03.14
✎
17:36
|
ее кто-то в документе закрыл уже...
|
|||
7
Господин ПЖ
13.03.14
✎
17:37
|
>так не работает
если руки с ж.пы... |
|||
8
Maxus43
13.03.14
✎
17:38
|
(7) это фича, зависит от того ещё что между Попытка/Исключение.
Чтобы вобще об этом не задумываться - делают (1) |
|||
9
Господин ПЖ
13.03.14
✎
17:39
|
>это фича, зависит от того ещё что между Попытка/Исключение.
в 1с вложенных транзакций нету... |
|||
10
Господин ПЖ
13.03.14
✎
17:40
|
Попытка
НачатьТранзакцию(); //здесь формирую и провожу документы программно Исключение Попытка ОтменитьТранзакцию();//тут ошибка "Транзакция не активна" КонецПопытки; КонецПопытки; ЗафиксироватьТранзакцию(); только попытка, только хардкор!!! |
|||
11
DS
13.03.14
✎
17:41
|
Гулять так гулять:
Попытка НачатьТранзакцию(); //здесь формирую и провожу документы программно ЗафиксироватьТранзакцию(); Исключение Попытка ОтменитьТранзакцию();//тут ошибка "Транзакция не активна" Исключение КонецПопытки; КонецПопытки; |
|||
12
Maxus43
13.03.14
✎
17:43
|
(9) >>в 1с вложенных транзакций нету
вложенных нет, но (1) же работает, сохраняя логику, которую хочет автор |
|||
13
Господин ПЖ
13.03.14
✎
17:44
|
(12) будет падать на ЗафиксироватьТранзакцию()
|
|||
14
Maxus43
13.03.14
✎
17:45
|
(13) не будет никуда падать, перед "попытка" конечно надо НачатьТранзакцию() ещё, 100500 раз проверено
|
|||
15
Добрый хачик
13.03.14
✎
17:51
|
в типовых схема из (4), остальное от лукавого
|
|||
16
Господин ПЖ
13.03.14
✎
17:58
|
(14) в (0) происходит нечто вроде:
Процедура КнопкаВыполнитьНажатие(Кнопка) Попытка НачатьТранзакцию(); А(); ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); КонецПопытки; КонецПроцедуры Процедура А() ЗафиксироватьТранзакцию(); а = 1/0; КонецПроцедуры // А() Куда совать ЗафиксироватьТранзакцию() в пределах КнопкаВыполнитьНажатие - пофиг, свалится... |
|||
17
Господин ПЖ
13.03.14
✎
18:01
|
где НачатьТранзакцию() тоже роли не играет
|
|||
18
fisher
13.03.14
✎
18:04
|
(0) "Попытка Исключение" реализована как неявная транзакция в 1С. Также в 1С псевдо-вложенные транзакции. Т.е. исключение уже ведет к откату вышестоящей транзакции. В итоге ты пытаешься откатить транзакцию которая уже откатилась.
|
|||
19
Gorr
13.03.14
✎
18:08
|
Кароче имеем два варианта:
Вариант1 (попытка внутри транзакции): ЕстьОшибка = ложь; НачатьТранзакцию(); Попытка //здесь формирую и провожу документы программно ... Исключение ЕстьОшибка = Истина; КонецПопытки; если ЕстьОшибка тогда ОтменитьТранзакцию(); иначе ЗафикситоватьТранзакцию(); конецесли; Вариант2: Попытка НачатьТранзакцию(); //здесь формирую и провожу документы программно ... ЗафикситоватьТранзакцию(); Исключение если ТранзакцияАктивна() тогда ОтменитьТранзакцию(); конецесли; КонецПопытки; Почему-то думается, что в первом варианте все равно будет ошибка. Тоже склоняюсь к тому, что не должно быть разницы где начинается транзакция. |
|||
20
Господин ПЖ
13.03.14
✎
18:09
|
кстати да... если количество начать/зафиксировать не равно друг другу + переход между клиент <> cервер 1с вызывает неявно ОтменитьТранзакцию
и автор получает граблей по спине, отменяя то чего уже нет... |
|||
21
Господин ПЖ
13.03.14
✎
18:10
|
Использование явного вызова транзакций
Метод НачатьТранзакцию() позволяет открыть транзакцию. После этого все изменения информации базы данных, выполняемые последующими операторами, могут быть либо целиком приняты, либо целиком отвергнуты. Для принятия всех выполненных изменений используется метод ЗафиксироватьТранзакцию(). Для того чтобы отменить все изменения, выполнявшиеся в открытой транзакции, используется метод ОтменитьТранзакцию(). Если количество вызовов метода НачатьТранзакцию() превышает количество вызовов методов ЗафиксироватьТранзакцию() или ОтменитьТранзакцию(), то система выполнит неявный вызов метода ОтменитьТранзакцию() в следующих случаях: ? при окончании выполнения встроенного языка (обработчик события, внешнее соединение, automation-сервер); ? при передаче управления с сервера на клиента. Если количество вызовов методов ЗафиксироватьТранзакцию() или ОтменитьТранзакцию() превышает количество вызовов метода НачатьТранзакцию(), то при выполнении лишнего вызова метода ЗафиксироватьТранзакцию() или ОтменитьТранзакцию() будет порождено исключение. Таким образом, схема работы с транзакцией в общем виде может выглядеть следующим образом: Попытка НачатьТранзакцию(); // Последовательность операторов ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); КонецПопытки; |
|||
22
fisher
13.03.14
✎
18:12
|
(18) Не, гоню. Вечно путаюсь в транзакциях и попытках.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |