Async context managers manage database transactions automatically.
1from sqlalchemy.ext.asyncio import AsyncSession2from contextlib import asynccontextmanager34# SQLAlchemy async session5async def get_db():6 async with AsyncSession(engine) as session:7 try:8 yield session9 await session.commit()10 except Exception:11 await session.rollback()12 raise1314# Custom transaction manager15@asynccontextmanager16async def transaction(session: AsyncSession):17 async with session.begin():18 yield session19 # Auto-commits on success, rollbacks on exception2021# Usage22async def transfer_money(from_id, to_id, amount):23 async with get_db() as db:24 sender = await db.get(Account, from_id)25 receiver = await db.get(Account, to_id)26 sender.balance -= amount27 receiver.balance += amount28 # Auto-commits when exiting context2930async def main():31 await transfer_money(1, 2, 100)3233asyncio.run(main())
Benefits: