Особливості нетранзакційного читання даних
Примітка: Ця стаття актуальна в тих випадках, коли використовуються СУБД:
Примітка: Ця стаття актуальна в тих випадках, коли використовуються СУБД:
- Microsoft SQL Server версій, молодших за 2005, або IBM DB2 версій, молодших за 9.7;
- Microsoft SQL Server версії 2005 і старше, якщо в конфігурації увімкнено режим сумісності з версіями, молодшими за 8.3.1.
Під час читання даних поза транзакцією слід враховувати особливості реалізації нетранзакційного читання даних у файловому та клієнт-серверному варіантах роботи.
Клієнт-серверний варіант роботи
У разі клієнт-серверного варіанта роботи під час нетранзакційного читання можна отримати нецілісні дані.
Відбувається це тому, що операції читання, які виконуються поза межами транзакції, використовують рівень ізоляції read uncommited, тобто буде прочитано незафіксовані зміни, виконані іншими транзакціями. Рівень ізоляції read uncommited використовується тому, що має бути забезпечена передбачувана швидкість під час виконання читання, тобто не можна "спотикатися" об блокування, встановлені транзакціями інших користувачів
Наочним проявом цієї особливості може слугувати запис у транзакції великої кількості нових документів і подальше скасування цієї транзакції. Якщо в процесі виконання такої транзакції в іншій сесії 1С:Підприємства відкрити список створюваних документів, то можна побачити, що в міру виконання коду створюються нові документи, а після скасування транзакції всі створені документи буде видалено. Так відбувається тому, що дані в динамічних списках читаються в нетранзакційному режимі, унаслідок чого, незважаючи на те, що транзакція активна, незафіксовані зміни, виконані в цій транзакції, будуть видимі іншим застосункам 1С:Підприємства:

Файловий варіант роботи
Під час роботи у файловому варіанті нетранзакційне читання виконується інакше. У файловому варіанті платформа 1С:Підприємство 8 підтримує версіонування під час нетранзакційного читання. Тому запити не вибирають дані незафіксованих змін інших транзакцій.
Наприклад, якщо порівнювати виконання попереднього прикладу у файловому варіанті та клієнт-серверному варіанті, можна зазначити такі відмінності:

Для випадку, коли виконувана транзакція успішно фіксується, порівняння роботи у двох варіантах роботи матиме такий вигляд:

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

Резюме
Якщо потрібно зчитати завідомо цілісний стан даних, то читання даних (наприклад, запити) слід виконувати в межах транзакції. У цьому разі гарантується цілісність і незмінність зчитаних даних. І якщо зчитувані дані є основою для якихось розрахунків, на підставі яких будуть виконуватися зміни даних (наприклад, під час проведення документів), то такі операції читання обов'язково мають виконуватися в межах транзакції. Це справедливо як для файлового, так і для клієнт-серверного варіанта роботи.
Водночас слід виважено підходити до використання транзакцій і застосовувати їх там, де це справді необхідно. Наприклад, прагнучи отримати цілісні дані, не слід без розбору включати до транзакцій цілі звіти; але якщо потрібно отримати узгоджену вибірку даних і виконати це за допомогою одного запиту не вдається, слід проаналізувати необхідність використання транзакції під час отримання такої вибірки.