8.9 Программная транзакционная память
static balances: Map<AccountId, TVar<Money>> = …
atomic {
let a = balances[from].get()
check(a >= amt) // иначе транзакция ждёт изменения и повторяется
balances[from].set(a - amt)
balances[to].update(.add(amt))
}atomic { … }выполняет тело как сериализуемую транзакцию надTVar. При конфликте тело перезапускается.- Тело ДОЛЖНО быть
pure(кроме операцийTVar); вызовы с эффектами — ошибка компиляции. check(cond)блокирует транзакцию до изменения прочитанныхTVar, еслиcondложно.atomic(db) { … }— другое: транзакция базы данных (§11.2).- Вложенный
atomic(в том числе через вызванную функцию) присоединяется к внешней транзакции. Телоatomic— выражение: значением является результат успешно завершившегося прогона. Паника или отмена внутриatomicотбрасывает записи транзакции и распространяется дальше; задача, ожидающая вcheck, — точка отмены (§8.6). TVarвнеatomic. Операция надTVarвне блокаatomic— отдельная транзакция из одной операции:getиsetатомарны, а составныеupdateиswapвне блока не атомарны как «чтение-изменение-запись»; для атомарного обновления их ДОЛЖНО выполнять внутриatomic { … }.checkвнеatomic— паника. ОперацииorElseСтандарт не требует (D-8052; DIV-009; D-7521..D-7524).
Связанные диагностики
См. также
Исходник: docs/spec/oxl-standard.md