Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

__ISSUE__


Для чего нужны транзакции

Недавно мне выпала честь тестировать документ, написанный чужой рукой. Сначала протестировал его в пользовательском режиме, потом потянуло меня посмотреть исходный код. Сразу обратил внимание на один участок. Выполняется запись нескольких объектов информационной базы - элемент справочника, элементы подчиненных справочников, записи регистров сведений. В общем, все эти записи логически связаны между собой. Но вот что смутило - ни обработки исключительных ситуаций, ни транзакции. При тестировании такая программа, конечно, скорее всего, выполнится без ошибок. Но в реальной работе в многопользовательском режиме есть риск возникновения исключительных ситуаций, связанных с конкурентным доступом к данным. Для разрешения проблем в подобных ситуациях используют транзакции.

Давайте разберемся, что такое транзакции, для чего они нужны, и как их правильно использовать. Транзакция - это группа последовательных операций, объединенных логикой выполнения приложения. Транзакция представляет собой логическую единицу работы с данными. Она может быть выполнена либо целиком и успешно, либо не выполнена вообще, и тогда она не должна произвести никакого эффекта. Другими словами, транзакция гарантирует логическую целостность данных.

В 1С для работы с транзакциями имеются три специальных процедуры:

  • НачатьТранзакцию(<Режим блокировок>)
    Открывает транзакцию. Необязательный параметр <Режим блокировок> типа РежимУправленияБлокировкойДанных может иметь значения Автоматический и Управляемый. Значение по умолчанию - Автоматический.
  • ЗафиксироватьТранзакцию()
    Завершает успешную транзакцию. Все изменения, внесенные в информационную базу в процессе транзакции, будут записаны.
  • Отменить Транзакцию()
    Отменяет открытую ранее транзакцию. Все изменения, внесенные в информационную базу в процессе транзакции, будут отменены.

Процедуры управления транзакциями удобно использовать совместно с оператором обработки исключительных ситуаций Попытка.

В качестве примера давайте рассмотрим участок кода, в котором записываются контрагент, договор контрагента и расчетный счет контрагента. Логика приложения такова, что мы должны либо успешно записать все три объекта, либо, в случае возникновения исключительной ситуации, полностью отменить операцию без каких-либо последствий для данных.

Попытка
    НачатьТранзакцию();
    
    КонтрагентОбъект = Справочники.Контрагенты.СоздатьЭлемент();
    КонтрагентОбъект.Наименование = НаименованиеКонтрагента;
    //Записываем другие реквизиты контрагента
    КонтрагентОбъект.Записать();
    КонтрагентСсылка = КонтрагентОбъект.Ссылка;
    
    ДоговорОбъект = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
    ДоговорОбъект.Владелец = КонтрагентСсылка;
    ДоговорОбъект.Наименование = НаименованиеДоговора;
    //Записываем другие реквизиты договора
    ДоговорОбъект.Записать();
    
    РСОбъект = Справочники.БанковскиеСчета.СоздатьЭлемент();
    РСОбъект.Владелец = КонтрагентСсылка;
    РСОбъект.НомерСчета = НомерРасчетногоСчета;
    //Записываем другие реквизиты договора
    РСОбъект.Записать();
    
    ЗафиксироватьТранзакцию();
Исключение
    ОтменитьТранзакцию();
    Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;

Как это работает. Читать далее >>

Дневник провинциального программиста
Copyright (C) 2009. Все права защищены.


В избранное