Оператор APPLY
Оператор APPLY - создание действия, применяющего изменения в базу данных.
Синтаксис
APPLY [NESTED [nestedPropertySelector] [CLASSES]] [SINGLE] [SERIALIZABLE] [action]
где nestedPropertySelector имеет один из следующих вариантов:
LOCAL
(propertyId1, ..., propertyIdN)
Описание
Оператор APPLY создает действие, которое применяет изменения в базу данных. С помощью указания ключевого слова NESTED можно указать локальные свойства, изменения которых не сбросятся при применении изменений. В состав этого оператора также входит действие, которое будет выполнено до применения изменений в базу.
Параметры
-
NESTEDОпциональное ключевое слово, после которого можно указать, какие локальные свойства сохранят свои изменения после выполнения оператора
APPLY. Само по себе, безLOCALи без списка свойств, на поведение оператора не влияет. -
LOCALКлючевое слово. Если указывается после
NESTED, то все локальные свойства сохранят свои изменения после выполнения оператораAPPLY. -
propertyId1, ..., propertyIdNНепустой список локальных свойств, указываемый после
NESTEDв круглых скобках. Каждый элемент списка является идентификатором свойства. Указанные в списке локальные свойства сохранят свои изменения после выполнения оператора. -
CLASSESКлючевое слово. Может быть указано, но на поведение оператора
APPLYне влияет. -
SINGLEОпциональное ключевое слово. Включает оптимизацию транзакции применения для случаев, когда применяемое действие читает хранимые свойства, которые оно же и изменяет: изменения таких хранимых свойств записываются в базу инкрементально по ходу транзакции, а не одним пакетом в конце применения.
-
SERIALIZABLEКлючевое слово, при указании которого устанавливается уровень изолированности транзакции Serializable.
-
actionКонтекстно-зависимый оператор, описывающий действие, которое будет выполнено перед применением изменений. Выполняется в одной транзакции с применением изменений, поэтому платформа может выполнить его более одного раза при автоматическом повторе транзакции после конфликта обновления, взаимной блокировки или таймаута — последствия описаны в статье применения изменений.
Примеры
CLASS Sku;
id = DATA INTEGER (Sku);
in = DATA LOCAL BOOLEAN (Sku);
locked = DATA BOOLEAN (Sku);
applyIn() {
in(Sku s) <- TRUE WHERE id(s) == 123;
APPLY NESTED (in[Sku]) {};
IF canceled() THEN
MESSAGE applyMessage();
FOR in(Sku s) DO
MESSAGE id(s); // показывает '123'
}
calculateInTransaction() {
APPLY {
id(Sku s) <- (GROUP MAX id(Sku ss)) (+) 1; // проставляем новый код внутри транзакции
}
}
// одиночный APPLY — сохраняет накопленные в сессии изменения
saveChanges() { APPLY; }
// оптимизация SINGLE в сочетании с применяемым действием
recalcCost() {
APPLY SINGLE {
id(Sku s) <- (GROUP MAX id(Sku ss)) (+) 1;
}
}
// сохраняем все локальные свойства при применении изменений
sendBatch() {
in(Sku s) <- TRUE;
APPLY NESTED LOCAL;
}
// SERIALIZABLE при записи хранимого свойства; применяемое действие — одиночный контекстно-зависимый оператор (без фигурных скобок)
unlock (Sku s) {
APPLY SERIALIZABLE locked(s) <- NULL;
}