Платформа "1С:Предприятие 8"
13.11.2013
Примечание: Данная статья актуальна в тех случаях, когда используются СУБД:
|
При чтении данных вне транзакции следует учитывать особенности реализации нетранзакционного чтения данных в файловом и клиент-серверном вариантах работы.
В случае клиент-серверного варианта работы при нетранзакционном чтении можно получить нецелостные данные.
Происходит это потому, что операции чтения, выполняемые вне рамок транзакции, используют уровень изоляции read uncommited, т.е. будут прочитаны незафиксированные изменения, выполненные другими транзакциями. Уровень изоляции read uncommited используется потому, что должна быть обеспечена предсказуемая скорость при выполнении чтения, то есть нельзя "спотыкаться" о блокировки, расставленные транзакциями других пользователей
Наглядным проявлением этой особенности может служить запись в транзакции большого количества новых документов и последующая отмена этой транзакции. Если в процессе выполнения такой транзакции в другой сессии 1С:Предприятия открыть список создаваемых документов, то можно увидеть, что по мере выполнения кода создаются новые документы, а после отмены транзакции все созданные документы будут удалены. Так происходит потому, что данные в динамических списках читаются в нетранзакционном режиме, в результате чего, несмотря на то, что транзакция активна, незафиксированные изменения, выполненные в этой транзакции, будут видны другим приложениям 1С:Предприятия:
При работе в файловом варианте нетранзакционное чтение выполняется иначе. В файловом варианте платформа 1С:Предприятия 8 поддерживает версионирование при нетранзакционном чтении. Поэтому запросы не выбирают данные незафиксированных изменений других транзакций.
Например, если сравнивать выполнение предыдущего примера в файловом варианте и варианте клиент-сервер, можно отметить следующие отличия:
Для случая, когда выполняемая транзакция успешно фиксируется, сравнение работы в двух вариантах работы будет выглядеть следующим образом:
Несмотря на то, что в файловом варианте работы поддерживается версионирование, при выполнении процедур, в которых используется неоднократное обращение к базе данных есть вероятность получить несогласованные данные. Это может произойти в результате того, что в период между выполнением одного и другого запроса состояние считываемых данных было изменено другой транзакцией:
Резюме |