|
Как залогировать ошибку из прерванной транзакции проведения? | ☑ | ||
---|---|---|---|---|
0
Euroset1
25.04.19
✎
16:55
|
Мы в обработчике проведения документа. Записываем лог в регистр. Вдруг документ не проводится из-за ошибки и логи все подтираются, ибо выполнялись в той же транзакции. Как залогировать неудачное проведение документа из его обработчика проведения?
|
|||
1
Вафель
25.04.19
✎
17:01
|
пиши в ЖР, после можно из жр достать и записать в регистр
|
|||
2
kortun
25.04.19
✎
17:10
|
Ведите логи во внешней базе, в этом случае они не зависят от транзакций
|
|||
3
Euroset1
25.04.19
✎
17:12
|
А выполнить в фоне не справится с этой задачей?
|
|||
4
Лефмихалыч
25.04.19
✎
17:47
|
(0) выбросьте свой регистр на помойку истории. для логов предусмотрен журнал регистрации
|
|||
5
Лефмихалыч
25.04.19
✎
17:48
|
(3) нет
|
|||
6
Euroset1
25.04.19
✎
17:52
|
(5) да! фоновые задания помогли.
(4) мне не нужен ЖР |
|||
7
H A D G E H O G s
25.04.19
✎
17:54
|
Посмотрим, что будет, когда конфу натянете в продакшен.
|
|||
8
Tonik992
25.04.19
✎
18:06
|
(7) Что может произойти?
|
|||
9
zehn
25.04.19
✎
18:55
|
(7) Ну какой у ларька продакшн?
|
|||
10
Cyberhawk
25.04.19
✎
19:13
|
Можно разорвать транзакцию, в т.ч. и неявную, но это конечно же не комильфо. Так что только в фоновом задании пиши.
|
|||
11
Лефмихалыч
25.04.19
✎
19:29
|
(6) тебе показалось. Откат транзакции в фоновом задании тоже удалит на зафиксированные записи из регистра.
|
|||
12
Лефмихалыч
25.04.19
✎
19:32
|
а, или ты... хех, гениально...
В результате ты получил бесполезный лог с мусором. Ты будешь смотреть в него и не будешь знать, которые записи в нем про то, что зафиксировано, а которые - про то, что откатилось. А ЖР бы тебе сам автоматически и без усилий с твоей стороны и фоновых всяких заданий показал статус транзакции. |
|||
13
palsergeich
25.04.19
✎
20:38
|
(12) Фоновое задание - это отдельный сеанс.
И откат транзакции в породившем сеансе никак не скажется на нем. |
|||
14
Лефмихалыч
25.04.19
✎
20:46
|
(13) я в (11) решил, что автор всё решил в фонове вывести, а не только запись в лог. в (12) я догадался, что речь идет только про лог, но это шняга, а не решение
|
|||
15
vde69
25.04.19
✎
22:00
|
попытка
начатьТранзакцию .... Если НадоВсеПрервать() Тогда ВызватьИстключение "Все пропало, ошибка 1234565432" КонецЕсли .... зафиксироватьтранзакцию Исключение ЗаписатьВЛевыйРегистрВнеТранзакции(ОписаниеОшибки()) КонецПопытки |
|||
16
vde69
25.04.19
✎
22:02
|
попытка
начатьТранзакцию .... Если НадоВсеПрервать() Тогда ВызватьИстключение "Все пропало, ошибка 1234565432" КонецЕсли .... зафиксироватьтранзакцию(); Исключение ЕслиТранзакцияАктивна() Тогда ОтменитьТранзакцию() КонецЕсли; ЗаписатьВЛевыйРегистрВнеТранзакции(ОписаниеОшибки()) КонецПопытки |
|||
17
Tonik992
25.04.19
✎
22:30
|
(16) В обработке проведения это не прокатит.
|
|||
18
vde69
25.04.19
✎
22:53
|
(17) прокатит... если так
попытка начатьТранзакцию оДок.Записать(); // скрытая транзакция Если НадоВсеПрервать() Тогда ВызватьИстключение "Все пропало, ошибка 1234565432" КонецЕсли .... зафиксироватьтранзакцию(); Исключение ЕслиТранзакцияАктивна() Тогда ОтменитьТранзакцию() КонецЕсли; ЗаписатьВЛевыйРегистрВнеТранзакции(ОписаниеОшибки()) КонецПопытки |
|||
19
palsergeich
25.04.19
✎
23:13
|
(18) В обработке проведения фиксировать транзакцию бесполезно, потому что она в идет в рамках открытой транзации.
|
|||
20
palsergeich
25.04.19
✎
23:17
|
(18) По факту это будут вложенные транзакции и они зафиксируются в момент фиксации транзакции самого верхнего уровня.
Но если во время вложенной ошибки происходила невозобновимая ошибка, то при следующем обращении к БД и будет сообщение - в данной транзакции уже происходили ошибки. В Вашем случае - при попытки записи в лог запись в лог откатится вместе с транзакцией верхнего уровня |
|||
21
palsergeich
25.04.19
✎
23:19
|
По этому именно транзакционные процедуры надо писать по стандарту, тогда не будет критических ошибок во вложенных транзакциях и этих дурацких бесполезных сообщений - в данной транзакции уже происходили ошибки.
|
|||
22
Cyberhawk
26.04.19
✎
09:09
|
(20) "В Вашем случае - при попытки записи в лог запись в лог откатится вместе с транзакцией верхнего уровня" // Не только откатится, а еще и упадет в необрабатываемое исключение с ошибкой "В данной транзакции уже происходили ошибки". Поэтому для гарантированной записи лога в том же сеанса надо "Если ТранзакцияАктивна()" заменить на "Пока ТранзакцияАктивна()", о чем в (10) уже было сказано )
|
|||
23
Euroset1
26.04.19
✎
12:14
|
Для истории: С фоновым заданием прокатило на ура.
Напоминаю, что задача состояла в том, чтобы залогировать неудачную отправку данных в оракл, когда при этом наш документ не должен провестись. То есть внешняя система что-то сделала, а наша система не сделала. В фоне логи пишутся. а ЖР в таких случаях использовать не комильфо, ибо он находится отдельно от SQL сервера, там, где жесткий диск слабее. Так как ЖР не все ведут, или чистят его каждый месяц. Ну и так далее. |
|||
24
Cyberhawk
26.04.19
✎
15:21
|
(23) Конечно использовать ЖР тогда, когда лог надо _гарантированно_ заиметь, не так надежно, как сразу писать в БД
|
|||
25
vde69
26.04.19
✎
21:12
|
(20) (22) звените, но Вы не правы...
пример в 18 полностью рабочий, по сколько сохранение в лог идет ВНЕ транзакции, тут нет асинхронности |
|||
26
palsergeich
26.04.19
✎
21:19
|
(25) ну ты имеешь ввиду запуск фонового к примеру? Тогда да
|
|||
27
palsergeich
26.04.19
✎
21:19
|
Просто если назвать процедуру Вне транзакции, это не значит, что она будет именно вне транзакции)
|
|||
28
vde69
26.04.19
✎
21:26
|
(27) приведи пример когда это так....
не забываем две вещи 1. транзакции привязаны к сеансу и имеют ИД 2. в рамках одного сеанса одновременно может быть только одна транзакция |
|||
29
palsergeich
26.04.19
✎
21:30
|
(28) вы немного не поняли что я хотел сказать.
Забей в общем, я верю, что ты все сделаешь правильно, в отличии от ТС. |
|||
30
Cyberhawk
26.04.19
✎
22:14
|
(26) Он как обычно бакланит, т.е. не понял даже простых слов
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |