执行、解码与事务
查询构建器不依赖数据库客户端。Query::compile 产生 CompiledQuery,内含 SQL 字符串与 Vec<Value>。Executor 负责把这两个值交给具体驱动。
Executor 契约
自定义运行时只需要实现这个边界。它不需要知道 SelectQuery 或其他构建器的类型状态。
Database 门面
Database<D, E> 保存方言和执行器,并把错误分成以下阶段:
解码
Row 暴露按位置读取的驱动中立 Value。FromValue 支持标量,FromRow 支持标量和元组。整数转换是有检查的,越界不会截断。
作用域事务
SQLite 与 PostgreSQL 执行器都提供作用域事务 API。操作成功时提交,返回错误时回滚:
手动事务通过 TransactionManager::begin、Transaction::commit 和 Transaction::rollback 提供。基础设施代码需要跨多个函数持有事务时再使用它。
取消安全
- SQLite 事务在回滚清理结束前持续持有共享连接 gate,其他 clone 不会抢先执行。
- SQLite savepoint 在取消后会先执行
ROLLBACK TO SAVEPOINT与RELEASE SAVEPOINT。 - PostgreSQL 会先把未完成事务的连接从池中分离,再异步回滚。
- 如果 Tokio runtime 已结束,关闭 PostgreSQL 连接会让服务器回滚事务。
这些保证阻止开放事务连接被过早交给后续请求,但不会自动重放应用操作。