Имя: Пароль:
1C
1С v8
Для чего в универсальной загрузке данных использовать транзакции?
0 vi0
 
20.04.16
09:36
В типовых модулях универсальных обменов используется возможность записывать данные в транзакции порционно. Как вы считаете, для чего это нужно? Если можно, аргументированно


Пока ... Цикл
    
    ...
    
    КоличествоЗаписанныхОбъектов = КоличествоЗаписанныхОбъектов + 1;
    
    Если ИспользоватьТранзакции
        И КоличествоЭлементовВТранзакции > 0
        И КоличествоЗаписанныхОбъектов = КоличествоЭлементовВТранзакции Тогда
        
        // Промежуточную транзакцию закрываем и открываем новую.
        ЗафиксироватьТранзакцию();
        НачатьТранзакцию();
        
        КоличествоЗаписанныхОбъектов = 0;
    КонецЕсли;
    
КонецЦикла;
1 hhhh
 
20.04.16
09:43
(0) для скорости. Существует КоличествоЭлементовВТранзакции, при которой достигается максимальнвя скорость.
2 vi0
 
20.04.16
09:56
http://its.1c.ru/db/metod8dev/content/2274/hdoc

Преимущества такого подхода заключаются в том, что, например, в файловом варианте работы действия, сгруппированные в одну транзакцию, выполняются значительно быстрее (до определенного предела).
3 hhhh
 
20.04.16
10:40
(2) ну да. Если например в транзакции несколько миллионов элементов, то она будет выполняться несколько часов и всё встанет колом. А если вы обмен выполняета раз в минуту и у вас там с десяток объектов, то конечно можно и в одной.
4 vi0
 
20.04.16
11:04
(3) у меня вопрос вообще в необходимости транзакций
5 DomovoiVShoke
 
20.04.16
11:19
(4)Сбой при записи, отказ при записи руками будете искать и откатывать?
6 AneJIbcuH
 
20.04.16
11:49
(0) Что есть транзакция, вам известно?
7 DomovoiVShoke
 
20.04.16
12:20
(6)За 11 лет наверное узнал, в его вопросе явно подвох есть)
8 vi0
 
20.04.16
14:07
(1) да, вот интересная ветка https://rsdn.ru/forum/db/3465511.flat

"Записть при массовом INSERT или UPDATE
ведётся точно так же, как и при одиночном, как в БД,
так и в лог. Только при этом запись в лог как правило
всегда физическая, а в БД -- логическая, т.е. только
в памяти, а в физическую перерастает только когда
кэш кончается.

Но транзакция состоит из трёх основных фаз

-- начало транзакции
-- операции транзакции
-- конец транзакции.

При массовых операциях начало и конец
транзакции участвуют в операции только один
раз, для всей транзакции (хотя часть работы
конца транзакции частично переносится в операции
транзакции). Вот на этом и происходит экономия.
При чём существенная.

Поясню. Конец транзакции -- это завершение
записи в лог транзакций. При этом durability
как правило требует, чтобы последняя страница
лога физически записалась на диск. Некоторые
алгоритмы предполагают даже, что это будет
сделано несколько раз. Если у нас 5 операций
по одной записи, то у нас будет 5 commit-ов
и n*5 сбросов последней страницы лога на диск.
Если будет 1 транзакция по 5 записей, то
будет 5 записей в последнюю страницу лога,
которые скорей всего влезут в одну страницу лога,
и потом 1 commit и n*1 сборосов этой страницы лога
на диск. В итоге -- в 5 раз меньше IO.

Если будет 1 тарнзакция по 10000 записей,
то записи, записываясь в лог, естественно,
в одну страницу не влезут, и по мере заполнения
лога страницы будут записываться на диск.
Но -- только по переполнению последней страницы
лога. И потом последняя активная страница
лога будет сброшена на диск по commit-у.

Но также надо понимать, что бесконечно
расти транзакция не может -- тупо кончится
лог и БД встанет. Поэтому надо выбирать размеры
транзакций где-то посредине между 1 и бесконечностью

Идеально было бы так расчитать, чтобы одна транзакция
полностью влезнла бы в одну страницу лога, но средств
для этого нет -- лог скрыт от программиста."
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.