Транзакции в «1С Предприятие 8»

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

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

Система «1С:Предприятие» осуществляет неявный вызов транзакций при выполнении любых действий, связанных с модификацией информации, хранящейся в базе данных. Например, все обработчики событий, расположенные в модулях объектов и наборов записей, связанные с модификацией данных базы данных, вызываются в транзакции. В транзакции выполняется также чтение объектов следующих типов: ПланОбменаОбъект, ДокументОбъект, СправочникОбъект, ПланВидовХарактеристикОбъект, ПланВидовРасчетаОбъект, ПланСчетовОбъект, БизнесПроцессОбъект, ЗадачаОбъект, ПоследовательностьНаборЗаписей, РегистрСведенийНаборЗаписей, РегистрНакопленияНаборЗаписей, РегистрБухгалтерииНаборЗаписей, РегистрРасчетаНаборЗаписей, ПерерасчетНаборЗаписей. При этом в режиме управляемых блокировок выполняется установка разделяемой блокировки по значению регистратора для наборов записей и по значениям отбора для набора записей независимого регистра сведений.

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

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

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

● при окончании выполнения встроенного языка (обработчик события, внешнее соединение, automation-сервер);

● при передаче управления с сервера на клиента.

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

Попытка

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

// Последовательность операторов

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

Исключение

ОтменитьТранзакцию();

КонецПопытки;

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

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

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

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

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

Попытка … Исключение … КонецПопытки.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Популярность: 21%

Рубрика: Настройка и оптимизация | Метки: | Оставить комментарий

Осторожно, управляемые блокировки.

Данная статья относится к релизу платформы 8.2.13.219 и наверное более ранним.

Начну с технических параметров. Платформа 8.2.13.219, конфигурация «Типовая Торговля для РБ 2.0» очень доработанная, одновременно работающих пользователей 130-140, свойство конфигурации «Режим управления блокировкой» —  «Автоматический».

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

В свойство конфигурации «Режим управления блокировкой» было установлено «Автоматический и управляемый», все регистры, подчиненные регистратору, были переведены в управляемый режим. В модулях где в запросах использовалась конструкция «ДЛЯ ИЗМЕНЕНИЯ» использовался объект конфигурации «БлокировкаДанных».

В модулях часто использовалась конструкция для блокировок, где одновременно встречались методы «УстановитьЗначение» и «ИспользоватьИзИсточника»

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки = Блокировка.Добавить(«РегистрНакопления.ТоварыНаСкладах»);
ЭлементБлокировки.УстановитьЗначение(«Качество», Справочники.Качество.НайтиПоКоду(«1»));
ЭлементБлокировки.ИсточникДанных = Товары;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Номенклатура», «Номенклатура»);
Блокировка.Заблокировать();

Сразу после перехода в такой режим работы менеджер класстера стал аварийно вылетать по нескольку раз на день. Все рекомендации найденные в интернете не приводили к положительному результату. Так проработали более месяца. Затем после выхода официального релиза 8.2.15 было решено переходить на новый релиз. При тестировании конфигурации на релизе 8.2.15 пришлось доработать блокировки  в текущей конфигурации. Было убрано одновременное использование «УстановитьЗначение» и «ИспользоватьЗначение«. В релизе 8.2.15 — это запрещено.

Как только изменения были применены к рабочей базе (релиз платформы 8.2.13.219), то аварийное завершение менеджера кластера прекратилось.

Популярность: 14%

Рубрика: Настройка и оптимизация | Метки: , | 2 комментария

Регистрация нескольких экземпляров сервиса сервера «1С:Предприятия» одной версии.

Для тестирования нового релиза платформы 1С 8.2.15 понадобилось запустить еще один сервис сервера на тестовым компьютере, где уже работал 8.2.13. Данную информацию я взял с диска ИТС.

Для того, чтобы выполнить такую регистрацию, следует воспользоваться утилитой sc.exe (находится C:\Windows\system32). При выполнении такой регистрации, должны различаться имена служб, номера сетевых портов и адреса каталогов кластера. В качестве примера рассмотрим командный файл, выполняющий регистрацию службы сервера.
Файл register-service.bat:

@echo off
rem %1 — полный номер версии 1С:Предприятия
rem %2 — первые две цифры номеров портов. Для портов 1540,1541,1560:1591 — это цифра 15
rem %3 — каталог с данными реестра кластера
set SrvUserName=.\USR1CV82
set SrvUserPwd=<пароль пользователя USR1CV82>
set RangePort=%260:%291
set BasePort=%241
set CtrlPort=%240
set SrvcName=»1C:Enterprise 8.2 Server Agent %CtrlPort% %1″
set BinPath=»\»C:\Program Files\1cv82\%1\bin\ragent.exe\» -srvc -agent -regport %BasePort% -port %CtrlPort% -range %RangePort% -d \»%~3\»
set Desctiption=»Агент сервера 1С:Предприятия 8.2. Параметры: %1, %CtrlPort%, %BasePort%, %RangePort%»
if not exist «%~3» mkdir «%~3»
sc stop %SrvcName%
sc delete %SrvcName%
sc create %SrvcName% binPath= %BinPath% start= auto obj= %SrvUserName% password= %SrvUserPwd% displayname= %Desctiption% depend= Dnscache/Tcpip/lanmanworkstation/lanmanserver

Данный командный файл выполняет регистрацию указанной версии сервера «1С:Предприятия». Имя службы является строкой, содержащей следующую информацию:
● 1C:Enterprise 8.2 Server Agent,
● Номер сетевого порта главного менеджера кластера,
● Полный номер версии «1С:Предприятия».
При регистрации сервера версии 8.2.15.294, использующего сетевой порт главного менеджера кластера с номером 3540, имя службы будет выглядеть следующим образом: 1 C: Enterprise 8.2 Server Agent 3540 8.2.15.294.

Пример использования:
register-service 8.2.15.294 35 » C:\Program Files\1cv82 \srvinfo15″
В данном примере первая строка выполняет регистрацию службы сервера со следующими параметрами:
● Имя службы: 1C:Enterprise 8.2 Server Agent 3540 8.2.15.294.
● Порты сервера: 3540, 3541, 3560:3591.
● Каталог с данными реестра кластера: c:\cluster_data\cluster 2.
● Описание службы: Агент сервера 1С:Предприятия 8.2. Параметры: 8.2.15.294, 3540, 3541, 3560:3591.
Если необходимо отменить регистрацию службы сервера, то можно воспользоваться следующим примером командного файла.
Файл unregister-service.bat:

@echo off
rem %1 — полный номер версии 1С:Предприятия
rem %2 — первые две цифры номеров портов. Для портов 1540,1541,1560:1591 — это цифра 15
set SrvcName=»1C:Enterprise 8.2 Server Agent %240 %1″
sc stop %SrvcName%
sc delete %SrvcName%

Пример использования:
unregister-service 8.2.15.294 35
Командный файл останавливает службу и удаляет ее регистрацию. Имя службы формируется по тем же правилам, что и при регистрации
новой (нестандартной) службы сервера «1С:Предприятия».

● Имя службы: 1C:Enterprise 8.2 Server Agent 3540 8.2.15.294.

Еще один способ установки второго сервиса сервера 1С той же платформы 1С 8.2.

Популярность: 4%

Рубрика: Настройка и оптимизация | Метки: , , | Оставить комментарий