<<
>>

9.2. Механизм транзакций

Независимо от выбранного варианта работы (файловый или клиент- серверный) система «ІС:Предприятие» обеспечивает работу с информацией, хранящейся в базе данных с использованием механизма транзакций.

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

Она выполняется по принципу «все или ничего» н переводит базу данных из одного целостного состояния в другое целостное состояние. Если по каким-либо причинам одно из действий транзакции невыполнимо или произошло какое-либо нарушение работы системы, база данных возвращается в то состояние, которое было до начала транзакции (происходит откат транзакции).

Транзакции могут использоваться как самой системой «ІС:Предприятие», такії разработчиком при написании модулей. Система «1С:Предприятие» осуществляет неявный вызов транзакций при выполнении любых действий, связанных с модификацией информации, хранящейся в базе данных. Например, все обработчики событий, расположенные в модулях объектов и наборов записей, связанные с модификацией данных базы данных, вызываются в транзакции.

Наряду с этим разработчик может использовать работу с транзакциями в явном виде.

Для этого используются процедуры глобального контекста

НачатьТранзакцию{), ЗафиксироватьТранзакцию() и ОтменитьТранзакцию ().

9.2.1, Использование явного вызова транзакций

Процедура НачатьТранзакцию () позволяет открыть транзакцию. После этого все изменения информации базы данных, выполняемые последующими операторами, могут быть либо целиком принять!, либо целиком отвергнуты.

Для принятия всех выполненных изменений используется процедура

ЗафиксироватьТранзакцию().

Для того чтобы отменить все изменения, выполнявшиеся в открытой транзакции, используется процедура ОтменитьТранзакцию ().

Таким образом, схема работы с транзакцией в общем виде может выглядеть следующим образом:

НачатьТранзакцию{); // Последовательность операторов

Попытка

// Последовательность выполняемых операторов

Исключение

ОтменитьТранзакцию(); КонецПопытки;

// Последовательность выполняемых операторов ЗафиксироватьТранзакцию();

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

В общем случае все ошибки базы данных можно разделить на две категории:

невосстановимые,

восстановимые.

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

Если невосстановимая ошибка произошла в процессе выполнения транзакции, то все изменения, сделанные в рамках этой транзакции, отменяются системой.

Восстановимые ошибки это ошибки, не вызывающие серьезных нарушений в работе системы «1С:Предприятие». В случае возникновения восстановимой ошибки дальнейшая работа системы может быть продолжена. Прн этом, естественно, сама операция, вызвавшая ошибку, прекращается, и вызывается исключение, которое может быть перехвачено и обработано конструкцией Попытка ... Исключение ... КонецПопытки,

Если восстановимая ошибка произошла в процессе выполнения транзакции, то система автоматически не выполняет отмену транзакции, предоставляя разработчику возможность самостоятельно обработать сложившуюся ситуацию.

В зависимости от характера произошедшей ошибки возможны различные сценарии обработки этой ситуации.

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

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

Например, фрагмент кода, реализующий этот подход при записи некоторых данных в базу данных, может выглядеть следующим образом.

// Признак окончания попыток выполнения записи Записано = Ложь;

// Попытки записи выполняются в цикле Пока Не Записано Цикл

Попытка НачатьТранзакцию (); Данные .

Записать () ,- ЗафиксироватьТранзакцию(); // В случае фиксации транзакции прекратить попытки записи Записано = Истина;

Исключение

//В случае неудачи отменить текущую транзакцию и // следующую попытку начать с новой транзакции ОтменитьТранзакцию!); КонецПопытки;

КонецЦикла

9.2.2. Вложенный вызов транзакций

В рамках уже выполняемой транзакции можно обращаться к процедурам

НачатьТранзакциюО , ЗафиксироватьТранзакцию() и ОтменитьТранзакцию (). Например, может использоваться следующая схема вызовов:

НачатьТранзакциюI);

II Вложенный вызов транзакции НачатьТранзакцию();

ЗафиксироватьТранзакцию();

// Вложенный вызов транзакции НачатьТранзакцию();

ЗафиксироватьТранзакцию));

ЗафиксироватьТранзакцию();

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

ВНИМАНИЕ! Система «1С:Предприятне» не поддержи нас і вложенных транзакции.

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

9.2.3. Влияние транзакций на работу программных объектов

В общем случае программные объекты, используемые системой «1С:Предпрнятие», абсолютно «прозрачны» для транзакций базы данных. Иначе говоря, транзакции базы данных могут вызываться при выполнении различных методов программных объектов, однако, например, действия, выполняемые базой данных при откате транзакции, в общем случае никак не влияют на соответствующие программные объекты.

Из этого следует, что при отмене транзакции базы данных разработчик (если в этом есть необходимость) должен самостоятельно обеспечивать адекватное изменение данных соответствующих программных объектов. Это можно выполнять путем повторного чтения всех данных объекта или путем изменения некоторых реквизитов программного объекта (если, например, это необходимо для отображения в интерфейсе).

В этом правиле есть исключения. В силу значительной прикладной специфики программных объектов системы «ЮПредприятие» в некоторых случаях откат изменений, выполненных в базе данных, все же может влиять на значения свойств соответствующих программных объектов. Это происходит следующих случаях:

при отмене транзакции признак проведенности документа восстанавливает значение, которое было до начала транзакции;

если объект был создан и записан в транзакции, то при откате транзакции очищается значение ссылки;

если объект создавался вне транзакции и при записи его в транзакции использовался код/номер, сгенерированный автоматически, то при отмене транзакции код/номер очищается,

<< | >>
Источник: А.Алексеев, А. Безбородое, Д. Бескоровайнов. 1С:Предприятие 8.2. Руководство разработчика. 2009

Еще по теме 9.2. Механизм транзакций:

  1. 9.3. Механизм управляемых блокировок
  2. 9.1. Механизм объектных блокировок
  3. 7. СТРУКТУРА ФИНАНСОВОГО МЕХАНИЗМА
  4. Механизм любви
  5. 3. Механизм действия экологического права
  6. 2.2. Рыночный механизм
  7. 2.2. Рыночный механизм
  8. 1.4 Финансовый механизм предприятия
  9. 18.3. МЕХАНИЗМ И ПРИНЦИПЫ УПРАВЛЕНИЯ
  10. § 5. Партии и внешнеполитический механизм
  11. Глава 8. Механизм бюджетно-правового регулирования
  12. РАЗДЕЛ IVЭКОНОМИЧЕСКИЙ МЕХАНИЗМ ФУНКЦИОНИРОВАНИЯ ПРЕДПРИЯТИЯ