Немного о транзакциях…

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

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

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

Процедура НачатьТранзакцию() позволяет открыть транзакцию. После этого все изменения информации базы данных, выполняемые последующими операторами, могут быть либо целиком приняты, либо целиком отвергнуты. Для принятия всех выполненных изменений используется процедура ЗафиксироватьТранзакцию(). Для того чтобы отменить все изменения, выполнявшиеся в открытой транзакции, используется процедура ОтменитьТранзакцию(). Для обеспечения принятия всех изменений транзакции можно организовать проверку возможности выполнения операций, но не всегда возможно предусмотреть все возможные проверки. В таких случаях разработчику можно воспользоваться конструкцией Попытка…Исключение…КонецПопытки. В конструкцию Попытка…КонецПопытки заключаются операторы, при выполнении которых может произойти исключительная ситуация, а после оператора Исключение описывается последовательность действий, которая должна выполняться в случае, если возникает исключительная ситуация (ошибка).

Вложенный вызов транзакции. Пример на рис. 1.

В рамках уже выполняемой транзакции можно обращаться к процедурам НачатьТранзакцию(), ЗафиксирватьТранзакцию() и ОтменитьТранзакцию(). Однако подобное обращение не означает начала новой транзакции в рамках уже выполняющейся. 1С не поддерживает вложенных транзакций. Это означает, что всегда действует только транзакция самого верхнего уровня. Все транзакции, вызванные внутри уже открытой транзакции, фактически относятся к той же транзакции, а не образуют вложенную транзакцию. Таким образом, отмена изменений, выполняемая во «вложенной» транзакции, будет приводить, в конечном счете, не к отмене изменений самой «вложенной» транзакции, а к отмене всех изменений транзакции верхнего уровня.