Перейти к основному содержимому
Версия: 7.0

Сессии изменений

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

Изменениями в сессии могут быть изменения первичных свойств, в том числе локальных, а также изменения классов объектов. Первые осуществляются действиями, созданными при помощи оператора изменения свойства, вторые - при помощи операторов добавления / изменения класса объектов.

При выполнении действия его текущая сессия определяется контекстом выполнения: для действия, вызванного с формы (наиболее частый случай), текущей сессией становится сессия этой формы; при вложенном вызове наследуется текущая сессия вызывающего действия; для запуска верхнего уровня (планировщик, обработчик события, удалённый вызов) сессия передаётся платформой при диспетчеризации действия. Текущая сессия также может быть заменена для вложенного действия оператором новой сессии.

Если действие в процессе выполнения обращается к некоторому свойству, то его значение вычисляется с учетом изменений, сделанных в текущей сессии этого действия.

Для сессии поддерживаются две основные операции — применение и отмена, а также набор операторов для работы с изменениями (в том числе получение предыдущего значения в сессии).

Отметим, что сессии изменений не является потокобезопасными, поэтому при использовании операторов, которые явно или неявно выполняют действия в новом потоке и при этом не блокируют свой поток выполнения, крайне не рекомендуется обращаться к текущей сессии после их выполнения (например такими "многопоточными" операторами являются операторы нового потока или асинхронного открытия формы). В этом случае рекомендуется всегда создавать новую сессию.