kw atomic
Зарезервированное слово
Список слов: §1.4
Синтаксис
Primary = Literal | Path | "it" | "self" | "(" Expr { "," Expr } ")" | ListLit | MapLit
| StructLit | Lambda | Block | If | Match | For | While | Loop | Scope | Select | Query
| "spawn" ( Postfix | Block ) | "await" Unary | "atomic" [ "(" Args ")" ] Block
| "return" [ Expr ] | "fail" Expr | "yield" Expr | "respond" Expr | "break" [ Label ] [ Expr ]
| "continue" [ Label ] | "emit" Path "(" Expr ")" | "unsafe" Block | "blocking" Block
| "comptime" Block | "." Ident [ "(" [ Args ] ")" ] ;Грамматика: Прил. A
Определяется в
- 8.9 Программная транзакционная память — atomic { … } выполняет тело как сериализуемую транзакцию над TVar.
- 11.2 Транзакция базы данных — Тело выполняется в транзакции базы db.
- 11.1 Виды транзакций — Виды транзакций
- 10.5 Топики — рассылка по кластеру — Топик — распределённый broadcast с хранением во встроенном хранилище.
- 12.8 Встроенное хранилище и таблицы — Хранилище на каждом узле роли journal, репликация — Raft на шард.
- 1.4 Ключевые слова — Зарезервированные (нельзя использовать как имена)
Примеры
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))
}— 8.9 Программная транзакционная память
atomic(db) {
db.insert(order)
db.update(User, uid) { ordersCount += 1 }
emit OrderEvents(OrderEvent.Created(order.id))
}Связанные диагностики
atomic-effects, atomic-db-effects, cross-shard-tx, topic-without-journal, query-not-sql, shard-count-clamped, table-schema