OxL Справочник OxL
РусскийEnglish

8.9 Программная транзакционная память

oxl
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).

atomic-effects

См. также

Исходник: docs/spec/oxl-standard.md