|
Для чего в универсальной загрузке данных использовать транзакции? | ☑ | ||
---|---|---|---|---|
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 и бесконечностью Идеально было бы так расчитать, чтобы одна транзакция полностью влезнла бы в одну страницу лога, но средств для этого нет -- лог скрыт от программиста." |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |