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

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

Как залогировать ошибку из прерванной транзакции проведения?
Я
   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) Он как обычно бакланит, т.е. не понял даже простых слов
 
 


Список тем форума
Рекламное место пустует  Рекламное место пустует
Читай всё полезное и впитывай, а нападки игнорируй. Здесь так принято. aka AMIGO
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.