Платформа "1С:Предприятие 8"
13.11.2013

Особенности нетранзакционного чтения данных

Примечание: Данная статья актуальна в тех случаях, когда используются СУБД:

  • Microsoft SQL Server версий, младше 2005 или IBM DB2 версий, младше 9.7;
  • Microsoft SQL Server версии 2005 и старше, если у конфигурации включён режим совместимости с версиями, младше 8.3.1.

При чтении данных вне транзакции следует учитывать особенности реализации нетранзакционного чтения данных в файловом и клиент-серверном вариантах работы.

Клиент-серверный вариант работы

В случае клиент-серверного варианта работы при нетранзакционном чтении можно получить нецелостные данные.

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

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

Файловый вариант работы

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

Например, если сравнивать выполнение предыдущего примера в файловом варианте и варианте клиент-сервер, можно отметить следующие отличия:

Для случая, когда выполняемая транзакция успешно фиксируется, сравнение работы в двух вариантах работы будет выглядеть следующим образом:

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

Резюме
Если требуется считать заведомо целостное состояние данных, то чтение данных (например, запросы) следует выполнять в рамках транзакции. В этом случае гарантируется целостность и неизменность считанных данных. И, если считываемые данные служат основой для каких-то расчетов, на основании которых будут производиться изменения данных (например, при проведении документов), то такие операции чтения обязательно должны выполняться в рамках транзакции. Это справедливо как для файлового, так и для клиент-серверного варианта работы.
Вместе с этим следует взвешенно подходить к использованию транзакций и применять их там, где это действительно необходимо. Например, стремясь к получению целостных данных, не следует огульно включать в транзакции целые отчеты; но если требуется получение согласованной выборки данных и выполнить это с помощью одного запроса не удается, следует проанализировать необходимость использования транзакции при получении такой выборки.