FastAPI + SQLAlchemy 异步事务完全指南
🚀 FastAPI + SQLAlchemy 异步事务完全指南|一篇搞定提交/回滚/异常处理
💡 收藏级教程:从原理到实践,手把手教你写出健壮的异步数据库事务代码
📌 开篇:为什么异步事务这么重要?
在现代高并发应用中,数据一致性是生命线。而事务(Transaction)正是保障一致性的核心机制。
当 FastAPI 遇上 SQLAlchemy 的异步模式,很多开发者会困惑:
- ❓
commit()和flush()有什么区别? - ❓ 异常时如何正确回滚?
- ❓
async with db.begin()真的能自动管理事务吗?
今天,我们就用一个完整可运行的示例,彻底搞懂 FastAPI 中的异步事务!🎯
🗂️ 项目结构一览
1 | project/ |
✅ 建议按此结构组织项目,职责清晰,便于维护
⚙️ 第一步:环境准备
1 | # requirements.txt |
1 | pip install -r requirements.txt |
🔔 注意:
sqlalchemy[asyncio]的[asyncio]extras 不能少,否则异步功能无法使用!
🔗 第二步:数据库配置(database.py)
1 | from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker |
🔑 关键参数解析
| 参数 | 作用 | 建议 |
|---|---|---|
echo=True |
打印 SQL 语句,便于调试 | 开发开启,生产关闭 |
future=True |
启用 2.0 风格 API | ✅ 始终开启 |
expire_on_commit=False |
提交后不自动过期对象 | ✅ 避免 Unexpected 错误 |
📦 第三步:模型与 Schema(models.py + schemas.py)
1 | # models.py |
1 | # schemas.py |
💡
from_attributes = True替代了旧的orm_mode = True,注意版本兼容性!
🎬 第四步:事务实战三部曲(main.py)
🌟 示例 1:基础提交事务
1 |
|
📝 记忆点:add → commit → refresh,三步走稳如老狗🐶
🔄 示例 2:手动回滚 + 异常处理
1 |
|
🔍 flush() vs commit() 对比
| 方法 | 作用 | 是否结束事务 | 典型场景 |
|---|---|---|---|
flush() |
将变更写入 DB,但不提交 | ❌ 否 | 提前检测约束错误、获取自增 ID |
commit() |
提交事务,变更永久生效 | ✅ 是 | 正常业务结束 |
💡 技巧:在
commit()前用flush()做”预检”,可提前捕获唯一键冲突等错误,避免部分写入!
🎁 示例 3:上下文管理器自动事务(推荐⭐)
1 |
|
✨ 优势:代码更简洁,永不忘记回滚,推荐作为默认写法!
🧠 事务使用 Checklist(收藏备用✅)
✅ 正确姿势
- 使用
async with async_session_maker()获取会话,确保自动关闭 - 写操作后必须
await db.commit() - 异常捕获中必须
await db.rollback() - 优先使用
async with db.begin()自动管理事务 - 需要提前校验约束时,用
flush()预刷
⚠️ 避坑指南
- SQLite 并发能力弱,生产请用 PostgreSQL/MySQL
- 事务中避免 HTTP 请求、文件 IO 等耗时操作,防止锁等待
-
refresh()需在commit()之后调用,否则可能拿不到最新值 - 不要复用已关闭的 Session,每次请求新建最安全
🎯 记忆口诀(30 秒记住核心)
1 | 🔹 会话获取用 async with |
🗣️ 默念三遍,事务不再翻车!
🧪 运行与测试
1 | # 启动服务 |
测试建议:
- 调用
/users/正常创建用户 ✅ - 调用
/users/rollback/观察回滚效果 + 500 响应 ✅ - 调用
/users/context/体验自动事务的简洁 ✅ - 重复提交相同
name/email,观察唯一约束错误处理 ✅
📚 延伸学习资源
- 📘 SQLAlchemy 2.0 异步文档
- 📘 FastAPI 数据库指南
- 🎥 推荐实践:将事务逻辑封装到 Service 层,保持路由简洁
💬 互动时间
你在异步事务中踩过哪些坑?
欢迎在评论区分享你的经验👇
👍 点赞 + ⭐ 收藏,下次写事务不迷路!
✨ 小结卡片(截图保存📸)
1 | ┌─────────────────────────────┐ |
记住这张卡片,事务编写如有神助🚀
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Nosaw博客!
评论







