Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Транзакция внутри попытки

Транзакция внутри попытки
Я
   Fannasankh
 
18.10.17 - 09:54
Кто-нибудь использовал конструкцию вида такого вида? 
Ошибка = Ложь;
Попытка
НачатьТранзакцию();
что-то делаем;
Если НЕ Ошибка Тогда
ЗафиксироватьТранзакцию
Иначе
ОтменитьТранзакцию()
КонецЕсли;
Исключение
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
Что-то делаем;
КонецПопытки;

Может ли привести к каким-то проблемам?
 
 
   Ненавижу 1С
 
1 - 18.10.17 - 09:57
Если ошибка не связана с работой транзакции, то ты об этом не узнаешь, например деление на ноль
   Fannasankh
 
2 - 18.10.17 - 09:59
(1) имелось ввиду, возможно ли падение программы при такой конструкции? Предполагается, что причины ошибки фиксируются в "что-то делается"
   vde69
 
3 - 18.10.17 - 10:16
на вскидку - вроде все очень даже правильно сделано, я подобные конструкции постоянно использую
   Ёпрст
 
4 - 18.10.17 - 10:22
(0)Проблема только одна - бездумное втыкание транзакции, где она вообще не нужна, это 99% проблем.
   Cyberhawk
 
5 - 18.10.17 - 10:24
   Fannasankh
 
6 - 18.10.17 - 10:25
(4) она там точно нужна
   Ёпрст
 
7 - 18.10.17 - 10:40
(6) сомневаюсь
   Fannasankh
 
8 - 18.10.17 - 10:44
(7) почему же? Там происходит проведение ряда документов по данным из другой базы. В момент проведения любого может возникнуть ошибка или что-то такое. И нужно откатиться будет.
   rphosts
 
9 - 18.10.17 - 10:47
(0)нет вывода никакой инфы юзеру о проблемах - это уже жирный минус.
   dezss
 
10 - 18.10.17 - 10:56
(9) как нету?
ведь есть Что-то делаем; после исключения...вот там оно и будет...вот прям стопудова...я хорошо думаю о людях, пока они не докажут обратное)
 
 Рекламное место пустует
   Ёпрст
 
11 - 18.10.17 - 10:59
(8) вот-вот. Явное втыкание одной большой транзакции туда, куда не надо.
   Fannasankh
 
12 - 18.10.17 - 11:01
(11) Ну а как тогда правильно? Есть определенный ответ от внешнего источника. Мы его или получаем или откатываемся к моменту до получения.
   dezss
 
13 - 18.10.17 - 11:01
(11) а почему не надо?
а как тогда отменить создание кучи связанных сущностей, если где-то в коде произошла ошибка?
   Лефмихалыч
 
14 - 18.10.17 - 11:02
(0) код, который после попытки, может скопытиться с формулировкой "В данной транзакции уже происходили ошибки"
   Cyberhawk
 
15 - 18.10.17 - 11:04
(14) Ну это если код выполняться будет во внешней какой-нибудь транзакции, у автора видимо такого нет )
   Fannasankh
 
16 - 18.10.17 - 11:05
(14) а что для этого должно произойти?
   Лефмихалыч
 
17 - 18.10.17 - 11:05
(15) ты это как определил? Обычно такие костыли лежат в модуле, который вызывается из модуля, который вызывается ПриЗаписи. Это же "haha classic"!
   Ёпрст
 
18 - 18.10.17 - 11:05
(12) ты проводишь 200 документов в одной большой транзакции, не провёлся один - ты откатываешь транзакцию.
В этот момент (в момент твоей транзакции, база нервно курит в сторонке)

Вопрос, и нафига оно надо ? Потом повторно опять проводить 200 документов, заместо одного ?

(13) они не связаны
   Лефмихалыч
 
19 - 18.10.17 - 11:06
(16) в (5) описано
   Fannasankh
 
20 - 18.10.17 - 11:06
(18) не 200. А около 4-5. Цепочка вида: Заказ-Реализация-Корректировка... что-то вроде того.
   dezss
 
21 - 18.10.17 - 11:07
(18) судя по (20) таки связаны
   Cyberhawk
 
22 - 18.10.17 - 11:09
(17) Не, у меня перед глазами картина такая, что код автора работает выделенно (внешняя обработочка какая-нибудь или кнопка)
   Fannasankh
 
23 - 18.10.17 - 11:12
(17) нет. Это вызывается регламентным заданием, отдельная процедура.
   Лефмихалыч
 
24 - 18.10.17 - 11:30
(23) иногда бывает, что транзакции начинаются и неявно.
В общем, тебе виднее. Мне добавить нечего.
   youalex
 
25 - 18.10.17 - 11:38
(20) А не логичнее будет обернуть в Попытку только запись документа, а при исключении - отменять транзакцию и выходить из цикла/функции или что там.
   Остап Сулейманович
 
26 - 18.10.17 - 11:50
(0) Вообще непонятна вложенность.
Классика жанра :

НачатьТранзакцию();
...
Попытка
   ЗафиксироватьТранзакцию();
Исключение
   ОтменитьТранзакцию();
КонецПопытки

То есть внутри попытка-исключение действия при успешному / неуспешном выполнению транзакции. А не все внутри попытки.
   Остап Сулейманович
 
27 - 18.10.17 - 11:54
+ (26) То есть в попытку завернуть только потенциально опасные действия. А не все.
   бомболюк
 
28 - 18.10.17 - 11:55
(27) "..." надо тоже в попытку заворачивать
   Злопчинский
 
29 - 18.10.17 - 11:56
А может сломаться именно на НачатьТранзакцию?
   бомболюк
 
30 - 18.10.17 - 11:58
(29) нет, может сломаться на "..."
   Остап Сулейманович
 
31 - 18.10.17 - 12:04
(30) Исправлюсь.
(0) Вообще непонятна вложенность.
Классика жанра :

НачатьТранзакцию();
...(1)
Попытка
   ...(2)
   ЗафиксироватьТранзакцию();
Исключение
   ОтменитьТранзакцию();
   ...(3)
КонецПопытки
, где
...(1) - подготовительные действия, ошибка в которых не приводит к изменению объектов БД.
...(2) - потенциально опасные действия, ошибка в которых может привести к нежелательным изменениям объектов БД. (Например нарушению ссылочной целостности)
...(3) - действия при возникновении исключительной ситуации.
   ildary
 
32 - 18.10.17 - 12:16
(31) чуточку упростил без потери наглядности:

НачатьТранзакцию(); 
  // подготовительные действия, ошибка в которых не приводит к изменению объектов БД 

Попытка 
  //потенциально опасные действия, ошибка в которых может привести к нежелательным изменениям объектов БД. (Например нарушению ссылочной целостности) 

   ЗафиксироватьТранзакцию();
Исключение
   ОтменитьТранзакцию();
  //действия при возникновении исключительной ситуации

КонецПопытки
   Фрэнки
 
33 - 18.10.17 - 12:34
(32) я бы перетащил НачатьТранзакцию внутрь Попытка
Так будет и наглядней и правильней.
 
 
   dezss
 
34 - 18.10.17 - 13:01
Народ, а если в процедуре есть ряд действий, которые могут вызвать ошибку, но есть и действия, которые ошибки в БД не вызовут, то лучше использовать одну Попытка - Исключение или для каждого действия с БД отдельные?
   GANR
 
35 - 18.10.17 - 13:20
(0) Я пользовался вот таким:

НачатьТранзакцию();

Попытка
    что-то делаем....
    ОтменитьТранзакцию();
Исключение

    ОтменитьТранзакцию();
    ВызватьИсключение;
конецПопытки
   GANR
 
36 - 18.10.17 - 13:22
+(35) да-да - именно отменить независимо от того ошибка там или не ошибка ))
   бомболюк
 
37 - 18.10.17 - 13:29
(36) может вместо 1го Отменить все таки Зафиксировать? ;-)
   GANR
 
38 - 18.10.17 - 13:42
(37) Неа - надо сформировать документы с заданными параметрами, получить из них данные, а потом стереть документы. ))


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует