|
Стоит ли делать принудительное начало/завершение транзакции при перепроведении документов? | ☑ | ||
---|---|---|---|---|
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; НачатьТранзакцию(); КонецЕсли было не понятно, в каком порядке делать |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |