1c премина към управлявани ключалки. Управление на транзакционно заключване

Системата 1C:Enterprise ви позволява да използвате два режима на работа с базата данни: режим на автоматично заключване в транзакция и режим на контролирано заключване в транзакция.

Основната разлика между тези режими е следната. Автоматичният режим на заключване не изисква от разработчика да предприеме каквото и да е действие за управление на заключвания в транзакция. Тези правила се осигуряват от системната платформа 1C:Enterprise чрез използване на определени нива на изолация на транзакциите в конкретна СУБД. Този режим на работа е най-простият за разработчика, но в някои случаи (например при интензивна едновременна работа на голям брой потребители), нивото на изолация на транзакциите, използвано в СУБД, не може да осигури достатъчен паралелизъм, което се проявява в под формата на голям брой конфликти при заключване, когато потребителите работят.

Когато работи в режим на управлявано заключване, системата 1C:Enterprise използва много по-ниско ниво на изолация на транзакциите в СУБД, което може значително да увеличи едновременността на потребителите на приложното решение. Въпреки това, за разлика от режима на автоматично заключване, това ниво на изолация на транзакцията вече не може само по себе си да гарантира спазването на всички правила за работа с данни в транзакция. Следователно, когато работите в управляван режим, разработчикът е длъжен самостоятелно да управлява ключалките, зададени в транзакцията.

В обобщение разликите при работа в режим на автоматично блокиране и в режим на контролирано блокиране са показани в следната таблица:

Задаване на режима на блокиране в конфигурацията

Конфигурацията има свойството Data Lock Control Mode. Всеки обект на приложение за конфигурация също има свойството Data Lock Control Mode.
Режимът на управление на заключването на данни за цялата конфигурация може да бъде зададен на Автоматичен, Управляван (по подразбиране за нова конфигурация) или Автоматичен и Управляван. Стойностите Automatic и Managed означават, че съответният режим на блокиране ще се използва за всички конфигурационни обекти, независимо от стойностите, зададени за всеки от обектите. Стойността Automatic and Managed означава, че за определен конфигурационен обект ще се използва режимът, посочен в неговото свойство Data Locking Control Mode: Automatic или Managed.
Трябва да се отбележи, че режимът на управление на заключването на данни, посочен за обект с метаданни, е зададен за онези транзакции, които се инициират от системата 1C:Enterprise при работа с данните на този обект (например при промяна на данните на обекта).
Ако например операцията по писане на обект се извършва в транзакция, инициирана от разработчика (методът StartTransaction(), тогава контролният режим на заключване на данни ще се определя от стойността на параметъра Locking Mode
метод StartTransaction(), а не стойността на свойството на метаданните на обекта за режим на заключване на данни.
По подразбиране параметърът за режим на блокиране е настроен на режим на управление на блокиране на данни, така че за
За да използвате режим на управлявано заключване в изрична транзакция, трябва да посочите стойността на този параметър
Управляван режим на заключване на данни.

Работа с управлявани ключалки с помощта на вградения език

За управление на заключвания в транзакция се използва вграденият езиков обект DataLock. Екземпляр на този обект може да бъде създаден с помощта на конструктор и ви позволява да опишете необходимите пространства за заключване и режими на заключване. За да зададете всички създадени ключалки, използвайте метода Lock() на обекта DataLock. Ако този метод се изпълни в транзакция (явна или неявна), заключванията се придобиват и ще бъдат освободени автоматично, когато транзакцията приключи. Ако методът Lock() се изпълни извън транзакция, няма да бъдат получени заключвания.

Задават се условия стойността на полето да бъде равна на посочената стойност или стойността на полето да е в посочения диапазон.
Условията могат да бъдат зададени по два начина:

  • чрез изрично указване на името и стойността на полето (метод SetValue() на обекта DataLockElement);
  • чрез указване на източник на данни, съдържащ необходимите стойности (свойството DataSource на обекта DataLockElement).

За всеки блокиращ елемент може да се зададе един от двата режима на блокиране:

  • споделено,
  • изключителен.

Таблицата за съвместимост на управляваното заключване изглежда така:

Режимът на споделено заключване означава, че заключените данни не могат да бъдат модифицирани от друга транзакция до края на текущата транзакция.
Изключително заключване означава, че заключените данни не могат да бъдат модифицирани от друга транзакция преди края на текущата транзакция, нито могат да бъдат прочетени от друга транзакция, която поддържа споделена ключалка на данните.

Характеристики на работа в режим „Автоматично и контролирано“.

Когато работите в режим на автоматично и контролирано блокиране, трябва да се вземат предвид две характеристики:

Независимо от режима, определен за дадена транзакция, системата ще инсталира подходящия управляван
блокиране.
Режимът на управление на заключването се определя от транзакцията от най-високо ниво. С други думи, ако друга транзакция е стартирана по време на стартирането на транзакцията, тогава стартираната транзакция може да бъде изпълнена само в режима, който е зададен за вече изпълняваната транзакция.

Нека разгледаме изброените функции по-подробно.

Първата характеристика е, че дори ако режимът за автоматично управление на заключването се използва за транзакция, системата допълнително ще инсталира съответните управлявани заключвания, когато записва данни в тази транзакция. Това означава, че транзакции, изпълнявани в режим на управлявано заключване, може да са в конфликт с транзакции, изпълнявани в режим на автоматично управление на заключване.

Втората характеристика е, че режимът на управление на заключването, посочен за обект с метаданни в конфигурацията или посочен изрично при стартиране на транзакция (като параметър на метода StartTransaction()), е само „желан“ режим. Действителният режим на управление на заключването, в който ще се изпълни транзакцията, зависи от това дали това извикване за стартиране на транзакцията е първото или дали друга транзакция вече е започнала в тази сесия на системата 1C:Enterprise до този момент.

Например, ако трябва да управлявате ключалки, когато пишете набори от регистрационни записи при публикуване на документ, тогава режимът на управлявано заключване трябва да бъде зададен както за самия регистър, така и за документа, тъй като записването на набори от регистрационни записи ще се извършва в транзакцията се отваря при писане на документа.

Механизъм заключвания на транзакцииизползвани за конкурентен потребителски достъп до СУБД.
Транзакцията е вид непрекъсната операция, по време на която състоянието на базата данни се променя. Това е минималното количество промяна: не можете да направите половин транзакция; ако транзакцията не завърши, базата данни ще бъде върната до първоначалното си състояние.
Тъй като транзакцията улавя масив от данни, възниква нюанс при достъпа до този масив: например една транзакция променя данните, а друга се опитва да ги прочете. Резултатът от четенето може да е неправилен, т.к няма да включва най-новите промени. Следователно изолацията на транзакции работи на ниво СУБД. Възможни са следните нива на изолация:

  • Прочетете без ангажименти- докато една транзакция променя масива, друга не може да го промени, но може да го прочете. Най-ниско ниво на изолация.
  • Прочетете ангажирани- докато една транзакция променя масива, друга не може да го промени или прочете
  • Повторно четене- докато една транзакция чете масива, друга не може да го промени, но може да го прочете
  • Може да се сериализира- докато една транзакция чете масива, друга не може да го промени или прочете. Всички операции са последователни. Максимално ниво на изолация.

Ако конфигурацията на 1C:Enterprise е настроена на автоматичен режим на заключване, тогава нивото на изолация на транзакцията се избира от СУБД. В случая на MS SQL, това ще бъдат нивата на повторяемо четене или сериализуемо, тоест изолацията на данните е близка до максимума. Това решава проблеми с коректността на данните, но може да доведе до блокиране на ниво СУБД при интензивна работа на потребителя. Следователно 1C:Enterprise има собствена функционалност за работа с ключалки, която се активира чрез активиране на режима на управлявани ключалки. В този случай нивото на изолация на транзакцията за MS SQL ще бъде ангажирано за четене. Самата платформа ще изолира данните, без да разчита на СУБД.

Режимът на управлявано заключване е активиран в свойствата на конфигурацията:

Освен това режимът на заключване може да бъде зададен за конкретни конфигурационни обекти:

Ако конфигурацията като цяло е настроена на автоматичен режим на заключване, тогава всички транзакции за всички регистри ще работят в автоматичен режим, независимо от режима, зададен за конфигурационния обект. Ако се управлява, тогава по подобен начин всички транзакции ще бъдат в управляван. Ако режимът на конфигуриране е зададен на Автоматичен и контролиран, тогава режимът за всеки обект ще се определя от неговите настройки.

Има една точка за автоматичен и контролиран режим. Една транзакция за потребител може да представлява няколко транзакции от гледна точка на платформата. Например, интерактивното осчетоводяване на документ в регистър прави дветранзакции - запис на самия документ, а в рамките на тази транзакция запис на набор от редове по регистър. В зависимост от режима на управление на заключването за самия документ и регистъра, който премества, са възможни четири ситуации:

  1. Режим на документ Автоматичен, режим на регистриране Автоматичен ->
  2. Документен режим Управляван, регистърен режим Управляван -> запис по регистър в управляван режим
  3. Режим на документ Автоматичен, регистрационен режим Контролиран -> запис по регистър в автоматичен режим
  4. Режим на документи Управляван, режим на регистриране Автоматичен -> изключение (грешка)

Въпрос 06.59 от изпита 1C: Platform Professional. Когато публикувате документ през който и да е регистър, ако документът има автоматичен режим на управление на заключване на транзакция и регистърът има управляван режим (опцията „Автоматично и управлявано“ се използва в свойствата на конфигурацията), тогава такова публикуване ще доведе до:

Верният отговор е вторият, определяме го от първата транзакция, ако е автоматичен, значи всичко е автоматично.

Въпрос 06.60 от изпита 1C: Platform Professional. Когато публикувате документ през който и да е регистър, ако документът има управляван режим за управление на заключвания на транзакции, а регистърът има автоматичен (в свойствата на конфигурацията се използва опцията „Автоматично и управлявано“), тогава такова публикуване ще доведе до:

  1. до ситуация на грешка
  2. цялата транзакция ще бъде завършена автоматично
  3. цялата сделка ще бъде завършена по контролиран начин

Правилният отговор е първият, определяме по първата транзакция, ако е контролиран, значи е грешка.

Въпрос 06.61 от изпита 1C: Platform Professional. Когато публикувате документ през който и да е регистър, ако документът има автоматичен режим за управление на заключвания на транзакции, а регистърът има управляван режим (опцията „Управляван“ се използва в свойствата на конфигурацията), тогава такова публикуване ще доведе до:

  1. до ситуация на грешка
  2. цялата транзакция ще бъде завършена автоматично
  3. цялата сделка ще бъде завършена по контролиран начин

Ползите от преминаването към управлявани брави в 1C 8.3 са казани повече от веднъж - това значително повишава ефективността и производителността на оборудването.

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

Самият процес не е толкова труден. Процесът обаче е доста деликатен. Превключването на контролиран режим от неквалифицирано лице може да влоши още повече нещата.

По-долу ще анализираме метода за преход от автоматичен към контролиран режим на блокиране.

Цялата техника се вписва в 7 кратки точки:

Превключете режима на заключване на „Управляван и автоматичен“ в палитрата със свойства на конфигурацията:

Вземете безплатно 267 видео урока за 1C:

Превключване на обект в управляван режим

Необходимо е да започнете с най-„натоварените“ документи. Превключете документа в режим на управлявано заключване:

Прехвърляне на регистри в управляван режим

Необходимо е да прехвърлите ВСИЧКИ 1C регистри (натрупване, счетоводство, информация, изчисление), които извършват движения с този документ, в режим на контролирано заключване:

Намерете всички транзакции с тези обекти

Трябва да намерите всички транзакции с тези обекти на метаданни. Както очевидни, така и неочевидни.

Изричните са тези, които се извикват в кода чрез метода “StartTransaction()”.

НЕ изрични - тези, които се извикват в манипулатори на обекти - “OnWrite”, “ProcessingWrite” и т.н.

Коригиране на програмен код в транзакция

За изрични транзакции е необходимо да прехвърлите параметъра „Управляван режим на заключване на данни“ към параметъра на метода „Стартиране на транзакция().

За НЕ изрични транзакции, задайте ключалки, като използвате системния обект „Заключване на данни“.

Пример за използване на блокиране:

Заключване = NewDataLock;
Заключващ елемент = Locking.Add("Accumulation Register.GoodsInWarehouses");
Блокиращ елемент.SetValue("Качество", Directories.Quality.FindByCode("1"));
LockElement.Mode = DataLockMode.Exclusive;
Заключващ елемент.DataSource = DocumentObject.ReturnableContainer;
Заключващ елемент.UseFromDataSource("Номенклатура", "Номенклатура");
LockElement.UseFromDataSource("Склад", "Склад");
Заключване.Заключване();

Сменете дизайна ЗА ПРОМЯНА

Ускорете 1C, като натиснете няколко бутона 2. Контролирани ключалки. 4 септември 2011 г

Ако прочетете методологията за прехвърляне на конфигурацията към управлявани брави от 1C, можете да намерите много интересни и страшни неща там. Всъщност е просто: В свойствата на конфигурацията променете режима на блокиране на данни - „Управляван“. Всичко. Поздравления - току-що преминахте към управлявани ключалки. Всъщност всичко е малко по-сложно - но не много.

Първо, кратка теоретична екскурзия - защо е необходимо блокиране: Тези, които имат достъп, разбира се, могат да го прочетат тук: http://kb.1c.ru/articleView.jsp?id=30 1C си направи труда да напише доста достъпна статия относно блокирането на данни. За тези, които нямат достъп, ще опиша накратко защо са необходими брави:

Пример 1. Ако след активиране на контролирани ключалки не правите нищо и в същото време започнете да обработвате 2 документа паралелно (единият от тях все още е част от секундата по-рано), тогава ще получим приблизително следната картина:

Транзакция 1 Транзакция 2 Състояние на балансите
Започнете | 1 бр
| Започнете 1 бр
| | 1 бр
Салда за четене | 1 бр
| Салда за четене 1 бр
| | 1 бр
Отписване от салда | 0 бр
| Отписване на салда -1 бр
Завършване |
Завършване

какво не е наред тук Контролът на остатъците е неуспешен. Вторият документ успя да прочете остатъка, преди първият да успее да ги запише. В същото време видях, че е останал само 1 артикул и спокойно ги отписах след първия. Струва си да се отбележи, че всъщност тук все още ще има запушвания. 2 документа няма да могат да отписват баланси едновременно; това е необходимо за логическата цялост на базата данни, но за решаване на проблема с приложението в този пример едва ли е полезно.

Сега ще се опитаме да коригираме ситуацията - в кода за изпълнение на документа ще напишем инсталирането на изключителна контролирана ключалка непосредствено преди четене на балансите:

Е, сега, след като разбрахме защо са необходими брави, остава само да инсталираме контролирани брави, където са необходими: а именно - само когато се извършва контрол на остатъчните вещества. Ако мениджър във вашата база данни има право да публикува документ, независимо дали има продукт (пари) на склад или не, защо ви е необходимо блокиране тогава? Можете просто да не ги инсталирате или да ги регистрирате и коментирате до по-добри времена. Ако контролирате балансите, тогава като правило това са 3-4 регистъра, добре, максимум 10. Контролът може да бъде преустановен както в общите процедури и функции, така и в модулите на набора от RN записи. Кодът е изключително прост, отворете асистента за синтаксис и вижте:

Блокиране = NewDataLock;
LockElement = Заключване. Добавяне ( "Регистър на натрупванията. Стоки в складове") ;
Заключващ елемент. SetValue("Качество", Директории. Качество. FindByCode("1" ) ) ;
Заключващ елемент. Режим = DataLockMode. Изключителен;
Заключващ елемент. DataSource = DocumentObject. ReturnableContainer;
Заключващ елемент. UseFromDataSource("Номенклатура", "Номенклатура" ) ​​;
Заключващ елемент. UseFromDataSource("Склад" , "Склад" );
Блокиране. Блок() ;

Всъщност всичко е ясно веднага - блокираме „стоки в складове“, изрично задаваме 1 измерение, вземаме стойностите на другите 2 от източника на данни - PM документ.

Тези, които са чели книги за 8.2, вероятно си спомнят за „Новата логика на осчетоводяване“ - когато балансите се контролират след записване на движенията на документи. Чудите се защо е така? Но нека преначертаем същата тази плоча, така че контролът на балансите и блокирането да бъде след записване на движенията:

Транзакция 1 Транзакция 2 Състояние на балансите
Започнете | 1 бр
| Започнете 1 бр
| | 1 бр
Отписване от салда | 0 бр
| Отписване от салда -1 бр
Блокиране | -1 бр
Салда за четене Опит за блокиране -1 бр
| Чака в блока -1 бр
| Чака в блока -1 бр
Завършване Чака в блока -1 бр
Блокиране -1 бр
Салда за четене -1 бр
| -1 бр
Отказ 0 бр

Разликата не е значителна на външен вид - получаваме увеличение на производителността поради факта, че в момента на отписване на салда (записването им в базата данни, което всъщност отнема време) все още няма блокиране. Блокирането става по-късно в края на транзакцията, където се извършва контрол на отрицателните салда, което напълно удовлетворява бизнес логиката на приложението.

Като знаете защо са необходими брави, вие наистина можете да ги управлявате въз основа на бизнес проблемите, които решавате. СУБД са разработени въз основа на предположението за осигуряване на максимална защита на данните. Ако, например, извършвате банкови транзакции, блокирането трябва да е навсякъде и на максимално ниво. По-добре е да блокирате ненужните записи, отколкото да позволите данните да бъдат непоследователни.

Ако продавате кифли или химикалки, едва ли ще имате нужда от толкова много блокировки. Чрез дефекти и неправилно класифициране по човешка вина вие губите стотици пъти повече, отколкото бихте могли, ако двама потребители едновременно обработват два идентични документа за доставка.

За да варират между такива различни задачи, СУБД излязоха с нива на изолация. Чрез задаване на нивото на изолация на транзакцията можете да кажете на СУБД кои заключвания да налага в различни случаи (при писане и при четене в транзакция); S (можете да четете или пишете) или X (не можете нито да четете, нито писане) се налагат ключалки.

Така че в автоматичен режим почти винаги ще имате ниво на изолация SERIALIZABLE, което ще наложи X ключалки, където е необходимо и където не е необходимо, което значително ще съсипе живота ви

А в управляван ще имате READ COMMITED, който ще прилага и незабавно освобождава S lock при четене, а X lock само при писане. Най-сложното ниво. Бързо приложено S заключване просто ви позволява да проверите дали някъде върху тези данни е поставено заключване X, което гарантира, че се четат само последователни данни, както е обичайно за дадено ниво на изолация, и ако прочетете и следвате действията, препоръчани в предишна статия, тогава дори ще има S заключвания при четене, така че на ниво СУБД само записът ще бъде блокиран по време на запис - което е правилно и необходимо за съгласуваност на данните.

Какво ще правите с управляваните ключалки е ваше решение. Но бих препоръчал да не бързате да ги инсталирате. Срещал съм компании, които имаха автоматичен режим на блокиране и думата „измъчван от блокиране“ се чуваше дори от устата на генералния директор, а в същото време контролът на отрицателните салда беше деактивиран....



Свързани публикации