При реализации обмена, как посредством универсального механизма обмена, так и с использованием механизма распределенных информационных баз, одна из задач, которые требуют решения, – это обеспечение целостности и согласованности данных.
Данная задача при использовании универсального обмена может решаться с использованием транзакций (листинг 3.87).
Листинг 3.87. Пример использования транзакций
НачатьТранзакцию();
// обработка данных
…
ЗафиксироватьТранзакцию();
При выгрузке данных в механизме распределенных информационных баз используется метод ЗаписатьИзменения() менеджера планов обмена (листинг 3.88).
Листинг 3.88. Пример использования метода «ЗаписатьИзменения()»
ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения, 0);
Второй параметр метода указывает количество элементов, записываемых в одной транзакции. Значение 0 указывает на то, что запись всех измененных данных производится в одной транзакции.
Такой подход (когда вся выгрузка или загрузка осуществляется в одной транзакции) обладает как определенными преимуществами, так и определенными недостатками.
Преимущества такого подхода заключаются в том, что, например, в файловом варианте работы действия, сгруппированные в одну транзакцию, выполняются значительно быстрее (до определенного предела). Кроме того, при выгрузке данных использование одной транзакции позволяет избежать несогласованности выгружаемых данных (например, когда после выгрузки документа, но до выгрузки наборов записей регистров произошло перепроведение документа).
Минусом такого подхода является снижение параллельности работы пользователей, так как выгружаемые данные будут заблокированы до окончания транзакции.
Кроме того, необходимо учитывать объем изменений, выполняемых в одной транзакции. Например, в файловом варианте все изменения, произведенные транзакцией, накапливаются в оперативной памяти, что при записи больших объемов данных может привести к исчерпыванию свободной памяти.
В клиент-серверном варианте такой опасности нет, но все-таки записывать большие объемы данных в одной транзакции не рекомендуется (из-за проблем параллельности блокировки тоже требуют ресурса сервера баз данных и т. п.).
При обмене большими порциями данных имеет смысл использовать несколько транзакций при загрузке или выгрузке данных.
Например, в алгоритме загрузки данных можно использовать следующий фрагмент кода, позволяющий разбивать процесс загрузки на несколько транзакций по 1000 элементов данных (в данном случае величина 1000 ? условная) – листинг 3.89.
Листинг 3.89. Пример использования нескольких транзакций при выгрузке данных
Счетчик = 0;
НачатьТранзакцию();
// обработка данных
…
Если Счетчик = 1000 Тогда
Счетчик = 0;
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
КонецЕсли;
// обработка данных
…
ЗафиксироватьТранзакцию();
В случаях использования механизма распределенных информационных баз количество объектов указывается вторым параметром метода ЗаписатьИзменения() (листинг 3.90).
Листинг 3.90. Пример указания количества элементов, записываемых в одной транзакции
ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения, 1000);
Следует отметить, что зачастую в каждом конкретном случае необходимо искать компромисс между скоростью и параллельностью работы пользователей.