Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Вложенность транзакций          
Batchir Подменю пользователя
сообщение 09.02.09, 17:55
Сообщение #1

Живет на форуме
Иконка группы
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1426 раз
Рейтинг: 0

1С:Предприятие 8.1 не поддерживает вложенных транзакций. Это значит, что, фактически, поддерживается только один уровень транзакции. То есть не существует возможности отменить действие транзакции некоторого уровня, не отменяя транзакции вышестоящего уровня.
Если транзакция уже начата, то вызов начала транзакции не выдает ошибки, но и не оказывает никакого влияния на работу системы. Однако система запоминает, что был вызов начала вложенной транзакции, чтобы соответственно "проигнорировать" и завершение транзакции данного уровня.

При вызове завершения вложенной транзакции реального завершения транзакции также не происходит. Система отмечает, что уровень транзакции уменьшился. Реальное завершение транзакции происходит только при вызове завершения транзакции на самом верхнем уровне.

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

Приведем пример:


НачатьТранзакцию();
 Объект1 = Справочники.Справочник1.СоздатьЭлемент(); 
 Объект1.Записать();
 НачатьТранзакцию();
 Объект2 = Справочники.Справочник1.СоздатьЭлемент(); 
 Объект2.Записать();
 ЗафиксироватьТранзакцию();



В этом примере не будет записан ни Объект1, ни Объект2, так как не зафиксирована транзакция верхнего уровня. И она автоматически будет завершена откатом.

Приведем другой пример:


 НачатьТранзакцию();
 Объект1 = Справочники.Справочник1.СоздатьЭлемент(); 
 Объект1.Записать();
 НачатьТранзакцию();
 Объект2 = Справочники.Справочник1.СоздатьЭлемент(); 
 Объект2.Записать();
 ОтменитьТранзакцию();
 ЗафиксироватьТранзакцию();


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

Приведем третий пример:


НачатьТранзакцию();
 Объект1 = Справочники.Справочник1.СоздатьЭлемент(); 
 Объект1.Записать();
 НачатьТранзакцию();
 Объект2 = Справочники.Справочник1.СоздатьЭлемент(); 
 Объект2.Записать();
 ЗафиксироватьТранзакцию();
 ЗафиксироватьТранзакцию();


Здесь будут записаны оба объекта, потому, что зафиксированы транзакции обоих уровней и не было отмены транзакции.

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

Следует иметь в виду, что при записи объектов и наборов записей система сама инициирует и фиксирует транзакцию, поэтому в обработчиках, например, таких как ПередЗаписью, фактически, транзакция уже начата, а по завершению обработчика транзакция фиксируется или отменяется в зависимости от значения параметра Отказ.

Также имеет смысл ознакомиться со статьей "Ошибки базы данных и транзакции".

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 28.03.24, 20:07
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!