11.2 Транзакция базы данных
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