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
相关产品推荐
相关产品推荐

