![]() |
|
Транзакция внутри попытки | ☑ | ||
---|---|---|---|---|
0
Fannasankh
18.10.17
✎
09:54
|
Кто-нибудь использовал конструкцию вида такого вида?
Ошибка = Ложь; Попытка НачатьТранзакцию(); что-то делаем; Если НЕ Ошибка Тогда ЗафиксироватьТранзакцию Иначе ОтменитьТранзакцию() КонецЕсли; Исключение Если ТранзакцияАктивна() Тогда ОтменитьТранзакцию(); КонецЕсли; Что-то делаем; КонецПопытки; Может ли привести к каким-то проблемам? |
|||
1
Ненавижу 1С
гуру
18.10.17
✎
09:57
|
Если ошибка не связана с работой транзакции, то ты об этом не узнаешь, например деление на ноль
|
|||
2
Fannasankh
18.10.17
✎
09:59
|
(1) имелось ввиду, возможно ли падение программы при такой конструкции? Предполагается, что причины ошибки фиксируются в "что-то делается"
|
|||
3
vde69
18.10.17
✎
10:16
|
на вскидку - вроде все очень даже правильно сделано, я подобные конструкции постоянно использую
|
|||
4
Ёпрст
гуру
18.10.17
✎
10:22
|
(0)Проблема только одна - бездумное втыкание транзакции, где она вообще не нужна, это 99% проблем.
|
|||
5
Cyberhawk
18.10.17
✎
10:24
|
Все по феншую: https://its.1c.ru/db/metod8dev#content:2313:hdoc
|
|||
6
Fannasankh
18.10.17
✎
10:25
|
(4) она там точно нужна
|
|||
7
Ёпрст
гуру
18.10.17
✎
10:40
|
(6) сомневаюсь
|
|||
8
Fannasankh
18.10.17
✎
10:44
|
(7) почему же? Там происходит проведение ряда документов по данным из другой базы. В момент проведения любого может возникнуть ошибка или что-то такое. И нужно откатиться будет.
|
|||
9
rphosts
18.10.17
✎
10:47
|
(0)нет вывода никакой инфы юзеру о проблемах - это уже жирный минус.
|
|||
10
dezss
18.10.17
✎
10:56
|
(9) как нету?
ведь есть Что-то делаем; после исключения...вот там оно и будет...вот прям стопудова...я хорошо думаю о людях, пока они не докажут обратное) |
|||
11
Ёпрст
гуру
18.10.17
✎
10:59
|
(8) вот-вот. Явное втыкание одной большой транзакции туда, куда не надо.
|
|||
12
Fannasankh
18.10.17
✎
11:01
|
(11) Ну а как тогда правильно? Есть определенный ответ от внешнего источника. Мы его или получаем или откатываемся к моменту до получения.
|
|||
13
dezss
18.10.17
✎
11:01
|
(11) а почему не надо?
а как тогда отменить создание кучи связанных сущностей, если где-то в коде произошла ошибка? |
|||
14
Лефмихалыч
18.10.17
✎
11:02
|
(0) код, который после попытки, может скопытиться с формулировкой "В данной транзакции уже происходили ошибки"
|
|||
15
Cyberhawk
18.10.17
✎
11:04
|
(14) Ну это если код выполняться будет во внешней какой-нибудь транзакции, у автора видимо такого нет )
|
|||
16
Fannasankh
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) описано
|
|||
20
Fannasankh
18.10.17
✎
11:06
|
(18) не 200. А около 4-5. Цепочка вида: Заказ-Реализация-Корректировка... что-то вроде того.
|
|||
21
dezss
18.10.17
✎
11:07
|
(18) судя по (20) таки связаны
|
|||
22
Cyberhawk
18.10.17
✎
11:09
|
(17) Не, у меня перед глазами картина такая, что код автора работает выделенно (внешняя обработочка какая-нибудь или кнопка)
|
|||
23
Fannasankh
18.10.17
✎
11:12
|
(17) нет. Это вызывается регламентным заданием, отдельная процедура.
|
|||
24
Лефмихалыч
18.10.17
✎
11:30
|
(23) иногда бывает, что транзакции начинаются и неявно.
В общем, тебе виднее. Мне добавить нечего. |
|||
25
youalex
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) - действия при возникновении исключительной ситуации. |
|||
32
ildary
18.10.17
✎
12:16
|
(31) чуточку упростил без потери наглядности:
НачатьТранзакцию(); // подготовительные действия, ошибка в которых не приводит к изменению объектов БД Попытка //потенциально опасные действия, ошибка в которых может привести к нежелательным изменениям объектов БД. (Например нарушению ссылочной целостности) ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); //действия при возникновении исключительной ситуации КонецПопытки |
|||
33
Фрэнки
18.10.17
✎
12:34
|
(32) я бы перетащил НачатьТранзакцию внутрь Попытка
Так будет и наглядней и правильней. |
|||
34
dezss
18.10.17
✎
13:01
|
Народ, а если в процедуре есть ряд действий, которые могут вызвать ошибку, но есть и действия, которые ошибки в БД не вызовут, то лучше использовать одну Попытка - Исключение или для каждого действия с БД отдельные?
|
|||
35
GANR
18.10.17
✎
13:20
|
(0) Я пользовался вот таким:
НачатьТранзакцию(); Попытка что-то делаем.... ОтменитьТранзакцию(); Исключение ОтменитьТранзакцию(); ВызватьИсключение; конецПопытки |
|||
36
GANR
18.10.17
✎
13:22
|
+(35) да-да - именно отменить независимо от того ошибка там или не ошибка ))
|
|||
37
бомболюк
18.10.17
✎
13:29
|
(36) может вместо 1го Отменить все таки Зафиксировать? ;-)
|
|||
38
GANR
18.10.17
✎
13:42
|
(37) Неа - надо сформировать документы с заданными параметрами, получить из них данные, а потом стереть документы. ))
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |