|   |   | 
| 
 | Стоит ли делать принудительное начало/завершение транзакции при перепроведении документов? | ☑ | ||
|---|---|---|---|---|
| 0
    
        DenYuliya 14.12.22✎ 17:50 | 
        Всем привет. 
 Такой вопрос: Стоит ли использовать принудительное начало и завершение транзакции при перепроведении массива документов? Что то вроде примера ниже, с использованием конструкций НачатьТранзакцию();, ЗафиксироватьТранзакцию();. Или можно и обойтись? Объем данных возможен большой, до 100 тыс документов. Смотрю примеры, не везде используется НачатьТранзакцию() ТабДокументов = ОтобратьДокументы(); ///получаем ТЗ со списком док, которые надо перепровести Для Каждого СтрокаТЗ Из ТабДокументов Цикл ДокСсылка = СтрокаТЗ.Ссылка.ПолучитьОбъект(); НачатьТранзакцию(); Попытка ДокСсылка.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный); ЗафиксироватьТранзакцию(); Исключение Если ТранзакцияАктивна() Тогда ОтменитьТранзакцию(); КонецЕсли; ВызватьИсключение; КонецПопытки; КонецЦикла; | |||
| 1
    
        Aleksey 14.12.22✎ 17:52 | 
        Именно так делать не стоит     | |||
| 2
    
        DenYuliya 14.12.22✎ 17:53 | 
        (1) почему?     | |||
| 3
    
        Kassern 14.12.22✎ 17:54 | 
        (0) это имеет смысл, когда проводится связка документов и вам нужно убедиться, что все документы из связки записались без ошибки, в противном случае - отменить транзакцию.     | |||
| 4
    
        Kassern 14.12.22✎ 17:54 | 
        У вас  ДокСсылка.Записать() - итак в транзакции выполняется     | |||
| 5
    
        tesei 14.12.22✎ 17:55 | 
        Транзакция в транзакции - оксюморон. Зачем столько документов перепроводить?     | |||
| 6
    
        DenYuliya 14.12.22✎ 17:55 | 
        (3) связка - имеется в виду логическая связка? Если использовать при групповом приведении логически не связанных между собой документах - использование   ЗафиксироватьТранзакцию(); навредит, или смысла просто не будет?     | |||
| 7
    
        DenYuliya 14.12.22✎ 17:56 | 
        (5) восстановить сбившуюся при переносе последовательность     | |||
| 8
    
        Kassern 14.12.22✎ 17:58 | 
        (6) Например вы проводите Реализацию, и меняете статус у заказа клиента. Первое у вас прошло успешно, а на втором вы словили ошибку с блокировками к примеру. Если вы выполняли это в транзакции, то можете ее отменить и тогда реализация так же откатится. В противном случае у вас реализация будет закрытая, а заказ - нет.     | |||
| 9
    
        Aleksey 14.12.22✎ 17:58 | 
        (7) и? ты начинаешь транзакцию, затем в рамках проведения платформа сама открывает неявную транзакцию. В результате у тебя только увеличиваются расходы на проведения     | |||
| 10
    
        DenYuliya 14.12.22✎ 17:58 | 
        (4) читала на хабре статью на эту тему, https://habr.com/ru/post/419715/ , вообще увлекательно, конечно. Пример взят оттуда.     | |||
| 11
    
        Aleksey 14.12.22✎ 17:59 | 
        Такая конструкция имеет право на жизнь когда у тебя в рамках одной транзакции проводиться пакет документов. К примеру начал транзакцию провел 100 документов зафиксировал транзакцию     | |||
| 12
    
        DenYuliya 14.12.22✎ 17:59 | 
        (8) я поняла, да, логическая связка между документами. В противном случае - использование конструкции ЗафиксироватьТранзакцию(); увеличит время обработки массива документов, так?     | |||
| 13
    
        DenYuliya 14.12.22✎ 18:01 | 
        (11) О, а вот это интересно. Можно же разбить массив из, например, 100 тысяч документов на пакеты по 100 документов, и проводить их в транзакциях? Можно какой-нибудь пример, или "кодовое слово для поиска"? Посмотрела бы, как это реализовать.     | |||
| 14
    
        Aleksey 14.12.22✎ 18:01 | 
        (10) что то не нашел там такого примера
 там есть НачатьТранзакцию(); Попытка ДелаемЧтоТо(); ЗафиксироватьТранзакцию(); Исключение Если ТранзакцияАктивна() Тогда ОтменитьТранзакцию(); КонецЕсли; ВызватьИсключение; КонецПопытки; Т.е. в делаем что то возможно создаются справочники, проводятся документы | |||
| 15
    
        Aleksey 14.12.22✎ 18:03 | 
        (13) надо смотреть. Ибо такая конструкция была актуально для 7-ки, так как на скуле при большом объеме документов падала скорость проведения, поэтому и били на пакеты.
 Возможно для 8-ке это уже не актуально | |||
| 16
    
        DenYuliya 14.12.22✎ 18:07 | 
        (14) не сказано, что под "что-то" имеется в виду "что угодно, кроме перепроведения массива документов"))). ЧЕм плох пример?
 (15) ну вот как раз проблема, что при перепроведении большого объема документов - очень падает скорость проведения. И они не успевают провестись все. | |||
| 17
    
        Aleksey 14.12.22✎ 18:10 | 
        (16) "ЧЕм плох пример" это вырожденный случай     | |||
| 18
    
        DenYuliya 14.12.22✎ 18:16 | 
        (17) эм, не поняла, в каком плане "вырожденный случай"?
 Если честно, я что-то запуталась. Короче, не стоит применять "НачатьТранзакцию" при стандартных случаях, верно? Если все-таки конструкция применена, это как-то делает хуже, или просто "не по фен-шую"? | |||
| 19
    
        DenYuliya 14.12.22✎ 18:26 | 
        (8) хм... еще вопрос. А если немного меняем условие и вместо "Перепровести массив документов" берем "Перепровести массив документов по одному контрагенту, где каждый документ влияет на статус последующего" (например, не проведется второй документ из ста и все, в сотом некорректный статус)- в этом случае прямое объявление начала транзакции уместно, верно я понимаю?     | |||
| 20
    
        Aleksey 14.12.22✎ 18:35 | 
        (18) Такое чувство что у за каждый тест из зарплаты деньги вычитают. Причем как минимум ползарплаты в минус уйдет, если ты просто запустишь проверку теории.
 Теория без практики нечто. Какая разница что я или кто-то еще скажет. Накидал пример запустил на копии несколько раз тест и сравнил результаты. Хз может на твоем железе и с твоей версии платформы "стоит применять "НачатьТранзакцию" при стандартных случаях" так как это даст прирост в скорости как в 10 раз. Либо наооборот ты не увидишь разницы (разница в пределах погрешности). Главное не жадничий и не проверяй теорию на 2-х документах. Это не показательно. Чем больше документов тем яснее будет результат | |||
| 21
    
        DenYuliya 14.12.22✎ 18:42 | 
        (18) да не, надеюсь не вычитают. Пытаюсь прощупать, совсем х**ню спорола с этой транзакцией, или как))). А то никогда ее не использовала, а тут на тебе - видимо и не надо было)     | |||
| 22
    
        DenYuliya 14.12.22✎ 18:44 | 
        (20) в (21) это было в ответ на (20)     | |||
| 23
    
        lodger 14.12.22✎ 18:44 | 
        (21) обычно, явную транзакцию используют, что провести или записать сразу массив связанных между собой объектов.
 чтобы в случае одного отказа - отменилась запись всей очерченной группы. | |||
| 24
    
        lodger 14.12.22✎ 18:47 | 
        второй трюк - транзакция для ускорения.
 просто взводим счетчик и фиксируем транзакцию каждые 500-1000-2000 объектов. размер порции варьируется от мощностей сервера. будучи зафиксированными одновременно - снижаются накладные расходы на каждую отдельную запись, но добавляются на общую фиксацию большого пакета. тут надо смотреть по месту - в зависимости от архитектуры и конкретной СУБД может даже увеличить время записи. | |||
| 25
    
        DenYuliya 14.12.22✎ 18:47 | 
        (23) Да, уже вроде бы поняла, не зря спросила. А если в какой-то момент принудительно рубанешь транзакцию - все предыдущее тоже не завершится?     | |||
| 26
    
        lodger 14.12.22✎ 18:48 | 
        а начинать и закрывать транзакцию для каждого отдельного объекта = баловство и никакого толку. все минусы и ни одного плюса.     | |||
| 27
    
        lodger 14.12.22✎ 18:48 | 
        (25) всё что было поставлено к записи в течении открытой транзакции - потеряется.     | |||
| 28
    
        DenYuliya 14.12.22✎ 18:49 | 
        (24) а могли бы примерно показать (или "что мне поискать"), как реализовать "и фиксируем транзакцию каждые 500-1000-2000 объектов"? 
 (26) минусы - увеличение времени обработки? | |||
| 29
    
        lodger 14.12.22✎ 19:01 | 
        (28) минусы - увеличение времени обработки? - да. увеличение нагрузки и времени.
 примерно показать - примерно уже рассказал в тексте. а как конкретно не нашел примера в сети, или не смог составить запрос. НачатьТранзакцию(); счетчикобъектов = 0; цикл ДокСсылка ДокСсылка = СтрокаТЗ.Ссылка.ПолучитьОбъект(); Попытка ДокСсылка.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный); счетчикобъектов = счетчикобъектов + 1; Исключение ОтменитьТранзакцию(); прервать; конецпопытки Если счетчикобъектов = 500 Тогда ЗафиксироватьТранзакцию(); счетчикобъектов = 0; НачатьТранзакцию(); КонецЕсли конеццикл Если ТранзакцияАктивна() Тогда ЗафиксироватьТранзакцию(); КонецЕсли; | |||
| 30
    
        DenYuliya 14.12.22✎ 19:09 | 
        (29) спасибо большое за пример, мне в части
 Если счетчикобъектов = 500 Тогда ЗафиксироватьТранзакцию(); счетчикобъектов = 0; НачатьТранзакцию(); КонецЕсли было не понятно, в каком порядке делать | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |