跳到主要内容

集合运行时

集合运行时

集合运行时是每次读取与写入的服务器端。它把查询编译成 SQL、评估策略、运行钩子、门控审批并记录审计——全部在同一条决策路径中完成。

查询编译

客户端的读取与写入以结构化操作到达,而非原始 SQL。运行时对照编译后的 schema 编译它们——包括连接、过滤与投影——因此租户代码从不拼接 SQL 字符串。

策略评估

每个操作都对照操作主体的 策略 评估:行条件收窄 SQL,脱敏剥离属性,审批配置决定直接、降级、门控或拒绝。

变更路径

  client.db.<collection>.mutate(values)
        │  precisely typed root + explicitly included relationships
        ▼
  ┌─────────────────────────────────────────────┐
  │  canonical mutation pipeline                │
  │  1. before hooks validate + patch input     │
  │     (outside the transaction)               │
  │  2. policy evaluation → direct / reduced /  │
  │     gated (approval) / denied               │
  │  3. root + relationships commit atomically; │
  │     bolt_collection_history and             │
  │     bolt_sync_outbox rows ride the txn      │
  │  4. after hooks + task enqueue (settle)     │
  └────────────────────┬────────────────────────┘
                       │  bolt_sync_outbox
                       ▼
              every local replica
  1. 客户端通过 client.db.<collection>.mutate(values) 发送精确类型化的根记录以及任何显式包含的关联
  2. before 钩子在校验候选数据,位于事务之外——拒绝时什么都不会写入
  3. 策略评估收窄操作并可能门控:直接、降级、需要审批或拒绝
  4. 根记录与每个包含的关系在同一个事务中原子对账——历史与 outbox 行同事务写入
  5. 写入提交后 after 钩子运行,同一事务写入的 outbox 行把变更带给每个副本

读取路径

副本能给出完全一致答案的实时查询——集合、过滤、排序、限制——从不到达服务器;客户端针对按策略过滤的本地副本执行它,而变更日志让副本保持最新。只有在副本仍在构建时,以及对于副本刻意拒绝的那些读取——关联展开、全文搜索、聚合与历史,它们位于本运行时而非查询编译器中——读取路径才等待网络。

单一事务

已包含的关联表示其完整期望状态:其中的行会被插入或更新,已存储但未出现其中的行会被删除,并且显式包含的关联会递归同步。未包含的关联保持不变。根图在一个事务中协调,因此要么所有已提交关联状态全部提交,要么全部不提交;授权、审批、钩子、历史、同步失效与事件仍位于同一条规范变更管线中。

编写面是 集合 ;写入走命令通道,而同步引擎负责把已提交变更向外传递。