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

Как залогировать ошибку из прерванной транзакции проведения?

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

попытка
  начатьТранзакцию 
    оДок.Записать();// скрытая транзакция

    Если НадоВсеПрервать() Тогда
      ВызватьИстключение "Все пропало, ошибка 1234565432"
    КонецЕсли
    ....
  зафиксироватьтранзакцию();
Исключение
  ЕслиТранзакцияАктивна() Тогда
    ОтменитьТранзакцию()
  КонецЕсли;
  ЗаписатьВЛевыйРегистрВнеТранзакции(ОписаниеОшибки())
КонецПопытки
   palsergeich
 
19 - 25.04.19 - 23:13
(18) В обработке проведения фиксировать транзакцию бесполезно, потому что она в идет в рамках открытой транзации.
   palsergeich
 
20 - 25.04.19 - 23:17
(18) По факту это будут вложенные транзакции и они зафиксируются в момент фиксации транзакции самого верхнего уровня.
Но если во время вложенной ошибки происходила невозобновимая ошибка, то при следующем обращении к БД и будет сообщение - в данной транзакции уже происходили ошибки.
В Вашем случае - при попытки записи в лог запись в лог откатится вместе с транзакцией верхнего уровня
   palsergeich
 
21 - 25.04.19 - 23:19
По этому именно транзакционные процедуры надо писать по стандарту, тогда не будет критических ошибок во вложенных транзакциях и этих дурацких бесполезных сообщений - в данной транзакции уже происходили ошибки.
   Cyberhawk
 
22 - 26.04.19 - 09:09
(20) "В Вашем случае - при попытки записи в лог запись в лог откатится вместе с транзакцией верхнего уровня" // Не только откатится, а еще и упадет в необрабатываемое исключение с ошибкой "В данной транзакции уже происходили ошибки". Поэтому для гарантированной записи лога в том же сеанса надо "Если ТранзакцияАктивна()" заменить на "Пока ТранзакцияАктивна()", о чем в (10) уже было сказано )
   Euroset1
 
23 - 26.04.19 - 12:14
Для истории: С фоновым заданием прокатило на ура.

Напоминаю, что задача состояла в том, чтобы залогировать неудачную отправку данных в оракл, когда при этом наш документ не должен провестись. То есть внешняя система что-то сделала, а наша система не сделала. В фоне логи пишутся.

а ЖР в таких случаях использовать не комильфо, ибо он находится отдельно от SQL сервера, там, где жесткий диск слабее. Так как ЖР не все ведут, или чистят его каждый месяц. Ну и так далее.
   Cyberhawk
 
24 - 26.04.19 - 15:21
(23) Конечно использовать ЖР тогда, когда лог надо _гарантированно_ заиметь, не так надежно, как сразу писать в БД
   vde69
 
25 - 26.04.19 - 21:12
(20) (22) звените, но Вы не правы...

пример в 18 полностью рабочий, по сколько сохранение в лог идет ВНЕ транзакции, тут нет асинхронности
   palsergeich
 
26 - 26.04.19 - 21:19
(25) ну ты имеешь ввиду запуск фонового к примеру? Тогда да
   palsergeich
 
27 - 26.04.19 - 21:19
Просто если назвать процедуру Вне транзакции, это не значит, что она будет именно вне транзакции)
   vde69
 
28 - 26.04.19 - 21:26
(27) приведи пример когда это так....

не забываем две вещи
1. транзакции привязаны к сеансу и имеют ИД
2. в рамках одного сеанса одновременно может быть только одна транзакция
   palsergeich
 
29 - 26.04.19 - 21:30
(28) вы немного не поняли что я хотел сказать.
Забей в общем, я верю, что ты все сделаешь правильно, в отличии от ТС.
   Cyberhawk
 
30 - 26.04.19 - 22:14
(26) Он как обычно бакланит, т.е. не понял даже простых слов
 
 Рекламное место пустует


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