You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLAlchemy异步连接查询成功后事务仍回滚问题求助

异步SQLAlchemy只读查询后事务回滚问题解决

核心原因

异步SQLAlchemy的会话默认会为所有操作开启事务,即便执行的是只读查询,若未主动结束事务(提交或设置自动提交),会话关闭时会触发自动回滚,这是框架的默认事务管理行为。

可行解决方案

  • 1. 显式提交只读事务
    查询完成后手动调用await session.commit(),结束事务后再关闭会话。只读操作的提交不会修改数据,仅用于终止事务上下文:
async def api_name():
    async with async_session() as session:
        result = await session.execute(select(YourModel).where(YourModel.id == target_id))
        data = result.scalar_one()
        await session.commit()  # 显式提交,避免回滚
        print("api_name retrieved successfully.")
    print("session closed successfully")
  • 2. 开启会话自动提交模式
    创建会话工厂时设置autocommit=True,每个查询会自动提交事务,无需手动干预:
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import sessionmaker

# 初始化异步引擎
engine = create_async_engine("postgresql+asyncpg://user:password@host/db_name")
# 创建带自动提交的会话工厂
async_session = sessionmaker(
    bind=engine,
    class_=AsyncSession,
    autocommit=True
)
  • 3. 使用只读事务上下文
    通过session.begin()上下文管理器包裹查询操作,上下文结束时会自动提交事务:
async def api_name():
    async with async_session() as session:
        async with session.begin():  # 自动管理事务生命周期
            result = await session.execute(select(YourModel).where(YourModel.id == target_id))
            data = result.scalar_one()
            print("api_name retrieved successfully.")
    print("session closed successfully")

验证方式

应用上述任一方法后,日志中的ROLLBACK记录会消失,事务会被正常提交而非回滚。

内容的提问来源于stack exchange,提问作者Vinuta Hiremath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 22:45:02