06 · TRANSACTIONS

事务跟随执行上下文

在同步线程和 asyncio.Task 中安全地复用、隔离或显式绑定 Session。

作用域正常退出时提交,发生异常时回滚。同步代码使用 Databasewith db:,异步代码使用 AsyncDatabaseasync with db:

普通作用域

同一线程或 asyncio.Task 内的嵌套作用域复用当前 Session。新的 Task 即使继承了 ContextVar,也会自动创建独立 Session。

async def worker(item):
    async with db:
        await tasks.add(item)


await asyncio.gather(worker(item1), worker(item2))

每个 worker 独立提交或回滚,不会并发操作同一个 AsyncSession。

强制新事务

new_session() 用于在同一个 Task 内创建独立短事务。

async with db as parent:
    async with db.new_session() as independent:
        assert independent is not parent

显式复用

reuse_session(session) 绑定一个已有 Session,但 ormate 不提交或关闭它。

async with db as session:
    async with db.reuse_session(session):
        await tasks.add({"title": "same transaction"})

跨 Task 并发复用同一个 AsyncSession 不受 SQLAlchemy 支持。

切断上下文继承

手动创建并跨生命周期传递的后台任务可以在入口使用 detached()

async def run_background_job(job):
    async with db.detached():
        await process(job)

detached() 只临时隐藏并恢复当前 Session,不负责创建、提交或关闭 Session。

ESC

输入关键词开始搜索文档。

已复制到剪贴板