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

11.2 Транзакция базы данных

oxl
atomic(db) {
  db.insert(order)
  db.update(User, uid) { ordersCount += 1 }
  emit OrderEvents(OrderEvent.Created(order.id))
}
  • Тело выполняется в транзакции базы db. Уровень изоляции — serializable для встроенного хранилища; для внешних баз — @isolation(level) или значение драйвера.
  • В теле разрешены эффект db только для этой базы и emit. Эффекты net, io и другие базы — ошибка компиляции; для net и io код диагностики — atomic-db-effects (эффекты time и rand не покидают процесс и допустимы).

Определяется реализацией. Другая база в теле (D-8064; D-7790). Эта реализация не отличает другую базу по набору эффектов: обращение к другой базе внутри atomic(db) не диагностируется.

  • Конфликт сериализации — автоматический повтор тела до DB_TX_RETRIES раз (значение кластера, по умолчанию 3) в пределах бюджета времени, затем паника TxConflict. atomic(db) сохраняет тип тела и не добавляет TxConflict к типу результата (поправка редакции 1.0: ранее — «ошибка», D-8052; DIV-012; D-7260..D-7262). Эти значения задаются в cluster { defaults { db_tx_retries n db_tx_retry_budget d } }; переменные окружения OXL_DB_TX_RETRIES и OXL_DB_TX_RETRY_BUDGET_MS сильнее значения кластера (D-8064; D-7780).
  • emit пишет событие в таблицу outbox той же базы; после коммита ретранслятор публикует его в топик (at-least-once).

Определяется реализацией. Outbox по типам баз (D-8055; DIV-014; D-4999, D-5484). Эта реализация: outbox работает для builtin:// (в том числе на узле без локального лидера шарда); для sqlite: и postgres: и для транзакций на удалённых шардах emit в atomic(db) не поддерживается (необязательная возможность).

  • Во встроенном хранилище транзакция ДОЛЖНА затрагивать один ключ шардирования; atomic(db, cross_shard: true) разрешает несколько шардов ценой двухфазного коммита.

Определяется реализацией. Двухфазный коммит между шардами (D-8055; DIV-021; D-4410). Необязательная возможность. Эта реализация 2PC не содержит: параметр cross_shard: true принимается с предупреждением cross-shard-tx, тело выполняется как обычная транзакция; запрос, выходящий за один шард, завершается во время работы ошибкой CrossShardTx. Предупреждение cross-shard-tx выдаётся и тогда, когда find/deleteById шардированных таблиц в одном теле используют разные литеральные ключи; ключи-переменные сравнить до запуска нельзя (D-8064; D-7790).

atomic-db-effects, cross-shard-tx

См. также

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