Python 비동기 처리와 SQAlchemy session_scope을 사용하는 비동기 처리가 문제가 될수 있다.
이유는
이런 이유로, 파이썬에 동시 요청이 들어왔을때, 동일한 db session을 사용하게된다.
동일 session 사용시 문제점
해결 방법
각 요청마다 새로운 session을 생성해서, 동시 요청시 동일 session을 공유하지 않게 하여, 트랜잭션 오류등 다른 요청에 영향을 주지 않게 해야한다.
from fastapi import Depends
from sqlachemy import create_engine
from sqlachemy.engine import Engine
from sqlachemy.ext.declarative import declarative_base
from sqlachemy.orm import Session
from typing import AsyncIterable, Optional
_db_connection: Engine = Optional[Engine]
engine_uri = 'postgresql://...'
def on_startup():
global _db_connection
_db_connection = create_engine(engine_uri)
def on_shutdown():
global _db_connection
if _db_connection:
_db_connection.dispose()
async def get_db_connection() -> Engine:
assert _db_connection is not None
return _db_connection
async def get_deb_session(db_conn: Engine = Depends(get_db_connection)) -> AsyncIterable[Session]:
ss = Session(bind=engine)
try:
yield ss
finally:
ss.close()