1с перейшов на керовані блокування. Управління транзакційними блокуваннями

Система “1С:Підприємство” дозволяє використовувати два режими роботи з базою даних: режим автоматичних блокувань у транзакції та режим керованих блокувань у транзакції.

Принципова відмінність цих режимів ось у чому. Режим автоматичних блокувань не вимагає від розробника будь-яких дій щодо управління блокуваннями у транзакції для того. Ці правила забезпечуються платформою системи “1С:Підприємство” за рахунок використання певних рівнів ізоляції транзакцій у тій чи іншій СУБД. Такий режим роботи є найпростішим для розробника, проте в деяких випадках (наприклад, при інтенсивній одночасної роботі великої кількості користувачів) рівень ізоляції транзакцій, що використовується в СУБД, не може забезпечити достатньої паралельності роботи, що проявляється у вигляді великої кількості конфліктів блокувань при роботі користувачів.

Працюючи як керованих блокувань система “1С:Підприємство” використовує набагато нижчий рівень ізоляції транзакцій у СУБД, що дозволяє значно підвищити паралельність роботи користувачів прикладного рішення. Проте, на відміну режиму автоматичних блокувань, цей рівень ізоляції транзакцій не може сам по собі забезпечити виконання всіх правил роботи з даними в транзакції. Тому при роботі в режимі, що керується, від розробника потрібно самостійно управляти блокуваннями, що встановлюються в транзакції.

У зведеному вигляді відмінності під час роботи в режимі автоматичних блокувань і в режимі керованих блокувань наведені в таблиці:

Встановлення режиму блокування конфігурації

Конфігурація має властивість Режим керування блокуванням даних. Кожен прикладний об'єкт конфігурації також має властивість Режим керування блокуванням даних.
Режим керування блокуванням даних для всієї конфігурації в цілому може бути встановлений у значення Автоматичний, Керований (встановлено за замовчуванням для нової конфігурації) та Автоматичний та керований. Автоматичний та Керований означає, що відповідний режим блокування буде використовуватися для всіх об'єктів конфігурації, незалежно від значень, встановлених для кожного з об'єктів. Автоматичний та керований означає, що для конкретного об'єкта конфігурації буде використаний той режим, який вказаний у його властивості Режим керування блокуванням даних: Автоматичний або Керований.
Слід зазначити, що режим управління блокуванням даних, вказаний для об'єкта метаданих, встановлюється для транзакцій, які ініціюються системою «1С:Підприємство» при роботі з даними цього об'єкта (наприклад, при модифікації даних об'єкта).
Якщо ж, наприклад, операція запису об'єкта виконується в транзакції, ініційованої розробником (метод Почати транзакцію ()), то режим керування блокуванням даних буде визначатися значенням параметра Режим блокування
методу Почати транзакцію(), а не значення властивості об'єкта метаданих Режим керування блокуванням даних.
За замовчуванням параметр Режим блокування має значення Режим Управління Блокуванням Даних. Автоматичний, тому для
того, щоб у явній транзакції використовувати режим керованих блокувань, слід вказувати значення цього параметра
Режим Управління Блокуванням Даних. Керований.

Робота з керованими блокуваннями засобами вбудованої мови

Для керування блокуваннями в транзакції призначено об'єкт вбудованої мови БлокуванняДаних. Примірник цього об'єкта може бути створений за допомогою конструктора та дозволяє описати необхідні простори блокувань та режими блокувань. Для встановлення всіх створених блокувань використовується метод Заблокувати() об'єкта БлокуванняДаних. Якщо цей метод виконується в транзакції (явному або неявному), блокування встановлюються і при закінченні транзакції буде знято автоматично. Якщо метод Заблокувати() виконується поза транзакцією, блокування не буде встановлено.

Умови задаються на рівність значення поля вказаному значенню або входження значення поля в зазначений діапазон.
Умови можуть бути задані двома способами:

  • за допомогою явної вказівки імені поля та значення (метод ВстановитиЗначення() об'єкта ЕлементБлокуванняДаних);
  • за допомогою вказівки джерела даних, що містить необхідні значення (властивість ДжерелоДаних об'єкта ЕлементБлокуванняДаних).

Для кожного елемента блокування може бути заданий один із двох режимів блокування:

  • розділяється,
  • винятковий.

Таблиця сумісності керованих блокувань виглядає так

Режим блокування, що розділяється, передбачає, що заблоковані дані не можуть бути змінені іншою транзакцією до закінчення поточної транзакції.
Виключний режим блокування передбачає, що заблоковані дані не можуть бути змінені іншою транзакцією до закінчення поточної транзакції, а також не можуть бути прочитані іншою транзакцією, що встановлює блокування, що розділяється на ці дані.

Особливості роботи в режимі «Автоматичний та керований»

При роботі в режимі керування блокуванням Автоматичний та керований слід враховувати дві особливості:

Незалежно від режиму, зазначеного для цієї транзакції, система встановлюватиме відповідні керовані
блокування.
Режим управління блокуваннями визначається транзакцією самого верхнього рівня. Іншими словами, якщо до моменту початку транзакції була розпочата інша транзакція, то транзакція, що починається, може бути виконана тільки в тому в режимі, який встановлений для вже виконується транзакції.

Розглянемо перелічені особливості докладніше.

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

Друга особливість полягає в тому, що режим керування блокуваннями, що вказується для об'єкта метаданих у конфігурації або вказується на початку транзакції в явному вигляді (як параметр методу Почати транзакцію ()), є лише «бажаним» режимом. Фактичний режим управління блокуваннями, в якому буде здійснюватися транзакція, залежить від того, чи є цей виклик початку транзакції першим, чи до цього моменту вже розпочато іншу транзакцію в даній сесії системи «1С:Підприємство».

Наприклад, якщо потрібно керувати блокуваннями при записі наборів записів регістра, під час проведення документа, то керований режим блокувань має бути встановлений як самого регістру, так документа, оскільки запис наборів записів регістру буде виконуватися в транзакції, відкритої під час запису документа.

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

  • Read uncommited- Поки одна транзакція змінює масив, інша не може його змінювати, але може читати. Найнижчий рівень ізоляції.
  • Read commited- Поки одна транзакція змінює масив, інша не може його ні міняти, ні читати
  • Repeatable read- Поки одна транзакція читає масив, інша не може його змінювати, але може прочитати
  • Serialaizable- Поки одна транзакція читає масив, інша не може його ні міняти, ні читати. Усі операції послідовні. Максимальний рівень ізоляції.

Якщо для конфігурації 1С:Підприємства встановлено режим автоматичних блокувань, то рівень ізоляції транзакції вибирається СУБД. У випадку з MS SQL це буде Repeatable read або Serializable рівні, тобто ізоляція даних близька до максимальної. Це вирішує проблеми з коректністю даних, але може призводити до блокування на рівні СУБД при інтенсивній роботі користувачів. Тому в 1С:Підприємстві є свій функціонал роботи з блокуваннями, який активізується включенням режиму керованих блокувань. У цьому випадку рівень ізоляції транзакцій для MS SQL буде Read commited. Платформа сама ізолюватиме дані, не покладаючись на СУБД.

Увімкнення режиму керованих блокувань відбувається у властивостях конфігурації:

Також режим блокування може бути встановлений для конкретних об'єктів конфігурації:

Якщо для конфігурації в цілому встановлено Автоматичний режим блокувань, то всі транзакції по всіх регістрах будуть працювати саме в автоматичному режимі, без того режиму, що виставлений для об'єкта конфігурації. Якщо керований - то аналогічно, всі транзакції будуть в керованому. Якщо ж для конфігурації виставлено режим Автоматичний і керований, то для кожного об'єкта буде визначатися його налаштуваннями.

Для режиму Автоматичний та керований є один момент. Транзакція, єдина для користувача може бути кілька транзакцій з погляду платформи. Наприклад, інтерактивне проведення документа з регістру робить двітранзакції - запис самого документа, і в цій транзакції запис набору рядків по регістру. Залежно від режиму управління блокуваннями для самого документа та рухомого ним регістру, можливі чотири ситуації:

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

Питання 06.59 іспиту 1С: Професіонал з платформи. При проведенні документа за яким-небудь регістром у разі якщо документ містить автоматичний режим управління транзакційними блокуваннями, а регістр керований (у властивостях конфігурації використовується варіант "Автоматичний і керований"), то таке проведення наведе:

Правильна відповідь другий, визначаємо по першій транзакції, якщо автоматична, то все автоматично.

Питання 06.60 екзамену 1С: Професіонал з платформи. При проведенні документа за яким-небудь регістром у разі якщо у документа встановлено керований режим керування транзакційними блокуваннями, а у регістру автоматичний (у властивостях конфігурації використовується варіант "Автоматичний та керований"), то таке проведення наведе:

  1. до виникнення помилкової ситуації
  2. вся транзакція буде виконана в автоматичному режимі
  3. вся транзакція буде виконана в керованому режимі

Правильна відповідь перша, визначаємо по першій транзакції, якщо керована, то помилка.

Питання 06.61 іспиту 1С: Професіонал з платформи. При проведенні документа за яким-небудь регістром у разі якщо документ містить автоматичний режим управління транзакційними блокуваннями, а регістр керований (у властивостях конфігурації використовується варіант "Керований"), то таке проведення наведе:

  1. до виникнення помилкової ситуації
  2. вся транзакція буде виконана в автоматичному режимі
  3. вся транзакція буде виконана в керованому режимі

Про користь переходу на керовані блокування в 1С 8.3 було сказано не раз — це значно підвищує ефективність та продуктивність роботи обладнання.

Якщо Вам потрібен партнер для переведення конфігурації в керований режим блокування, просто зверніться до нас! Подробиці - .

Сам собою процес не такий вже й важкий. Однак процес досить тонкий. Перехід на керований режим некваліфікованим фахівцем може зробити ще гіршим.

Нижче ми розберемо методику переходу з режиму автоматичного блокування на керовані.

Вся методика міститься в 7 коротких пунктах:

Переключіть на панелі властивостей конфігурації режим блокування — «Керований та автоматичний»:

Отримайте 267 відеоуроків з 1С безкоштовно:

Переключення об'єкта в керований режим

Необхідно починати із «найзавантаженіших» документів. Переключіть документ у режим блокування «Керований»:

Переведення регістрів у керований режим

Необхідно перевести ВСІ регістри 1С (накопичення, бухгалтерії, відомостей, розрахунку), які здійснюють рух даним документом, в режим керованих блокувань:

Знайти усі транзакції з цими об'єктами

Необхідно знайти всі транзакції з цими об'єктами метаданих. Як очевидні, так і не очевидні.

Явні - ті, які викликаються в коді за допомогою методу "Почати транзакцію ()".

НЕ явні - ті, що викликаються в обробниках об'єктів - "ПріЗаписи", "ОбробкаПроведення" і т.д.

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

Для явних транзакцій необхідно передати до параметра методу «Почати транзакцію()» параметр «Режим Управління Блокуванням Даних. Керований».

Для НЕ явних транзакцій встановити блокування за допомогою об'єкта системи «БлокуванняДаних».

Приклад використання блокування:

Блокування = Новий БлокуванняДаних;
ЕлементБлокування = Блокування.Додати(«РегістрНакопичення.ТовариНаСкладах»);
Елемент Блокування.
ЕлементБлокування.Режим = РежимБлокуванняДаних.Винятковий;
ЕлементБлокування.ДжерелоДаних = ДокументОб'єкт.ПоворотнаТара;
ЕлементБлокування.ВикористовуватиДжерелаДаних(«Номенклатура», «Номенклатура»);
ЕлементБлокування.ВикористовуватиДжерелаДаних(«Склад», «Склад»);
Блокування. Заблокувати ();

Замінити конструкцію ДЛЯ ЗМІНИ

Прискорити 1С натисканням кількох кнопок 2. Керовані блокування. September 4th, 2011

Якщо прочитати методику перекладу конфігурації на керовані блокування від 1С – можна там знайти багато всього цікавого та лякаючого. Насправді все просто: У властивостях конфігурації змінюєте режим блокування даних - "Керований". Всі. Можу вас привітати – ви щойно перейшли на керовані блокування. Насправді все дещо складніше – але не на багато.

Для початку невеликий теоретичний екскурс - навіщо потрібні блокування: У кого є доступ, звичайно можна прочитати тут: http://kb.1c.ru/articleView.jsp?id=30 1С перейнялися написати досить доступну статтю про блокування даних. У кого ж доступу немає двома словами опишу для чого потрібні блокування:

Приклад 1. Якщо після включення керованих блокувань нічого не робити, і при цьому почати паралельно проводити 2 документи (адже один з них все одно на частку секунди раніше), то отримаємо приблизно наступну картину:

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

Що тут не таке? Контроль залишків дав збій. Другий документ встиг прочитати залишки раніше, ніж перший встиг їх записати. При цьому побачив, що на залишках 1 штука і спокійно списав їх за першим. Варто зазначити, що за фактом блокування тут таки будуть. 2 документи не зможуть списати залишки одночасно, це необхідно для логічної цілісності БД, але для вирішення прикладного завдання в цьому прикладі навряд чи корисно.

Тепер постараємося виправити ситуацію - у коді проведення документа пропишемо встановлення ексклюзивного керованого блокування безпосередньо перед читанням залишків:

Ну тепер, коли розібралися навіщо блокування потрібно тільки встановити керовані блокування там де це потрібно: а саме - тільки там, де проводиться контроль залишків. Якщо у вас в базі менеджер має право провести документ незалежно від того, є товар (гроші) на залишках чи ні, навіщо вам тоді блокування? Можете їх просто не встановлювати, або прописати та закоментувати до кращих часів. Якщо ж у вас проводиться контроль залишків то зазвичай це 3-4 регістри, ну максимум десяток. Контроль можна підвісити як у загальні процедури та функції, так і в модулі набору записів РН. Код гранично простий, відкриваємо синтаксис помічник - дивимося:

Блокування = Новий БлокуванняДаних;
ЕлементБлокування = Блокування. Додати( "РегістрНакопичення.ТовариНаСкладах") ;
ЕлементБлокування. УстановитиЗначення("Якість" , Довідники. Якість. ЗнайтиПоКоду("1" ) ) ;
ЕлементБлокування. Режим = РежимБлокуванняДаних. Винятковий;
ЕлементБлокування. ДжерелоДаних = ДокументОб'єкт. ПоворотнаТара;
ЕлементБлокування. ВикористовуватиДжерелаДанних("Номенклатура" , "Номенклатура" ) ;
ЕлементБлокування. ВикористовуватиДжерелаДаних("Склад", "Склад");
Блокування. Заблокувати() ;

Власне все відразу зрозуміло - блокуємо "товари на складах", 1 вимір стаємо у явному вигляді, значення 2-х інших візьмемо з джерела даних - ТЧ документа.

Ті, хто читав книжки по 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 блокування при читанні, і X тільки при записі. Найхитріший рівень. Швидко накладається S блокування дозволяє перевірити чи не накладена де на ці дані X блокування, що і забезпечує читання тільки узгоджених даних, як прийнято для даного рівня ізоляції, а якщо ви прочитали і виконали дії, рекомендовані в попередній статті, то не буде навіть S блокування при читанні, таким чином на рівні СУБД блокуватиметься лише запис під час запису - що правильно і необхідно для узгодженості даних.

Як же ви зробите з керованими блокуваннями - тільки ваше рішення. Але я рекомендував би не поспішати їх встановлювати. Я зустрічав компанії, в яких був автоматичний режим блокування, при цьому слово "замучали блокування" звучало навіть з вуст генерального директора, і при цьому було відключено контроль негативних залишків.



Подібні публікації