Pymongo로 transaction 구현 중 pymongo.errors.InvalidOperation: Can only use session with the MongoClient that started it

sig03
3 min readMay 17, 2023

--

pymongo로 트랜젝션을 구현중이었다. 코드가 길어져 일부 로직을 함수로 분리해 트랜젝션 안에서 실행하도록 했다.

# views.py
from lib.py import SomeFunc
...
with client.start_session() as session:
with session.start_transaction():
UserCollection.insert_one(data, session=session)
SomeFunc(session)
...


# lib.py
def SomeFunc(session)
AddrCollection.insert_one(data, session=session)

그러나 아래와 같은 에러가 발생했다. session 만 전달해주면 돼야하는데.

pymongo.errors.InvalidOperation: Can only use session with the MongoClient that started it

session 이 달라서 발생하는 문제라고 한다. 전체 소스를 뒤져보니 lib.py에 이미 MongoClient로 AddrCollection을 가져오고 있었다. MongoClient가 달라서 다른 세션으로 간주했던 것.

# lib.py
client = pymongo.MongoClient(HOST_FILE, tz_aware=True)
dbname = client['databases']
AddrCollection = dbname['address']
...
def SomeFunc(session)
AddrCollection.insert_one(data)

lib.py에서 AddrCollection 을 사용중이라 제거는 안 되고 함수 호출 때 콜렉션을 전달하도록 수정했다. 그럼 lib.py에서는 별개의 세션으로 인식하고 트랜젝션에서 전달한 세션으로 간주하고 처리한다.

# views.py
from lib.py import SomeFunc
...
with client.start_session() as session:
with session.start_transaction():
UserCollection.insert_one(data, session=session)
SomeFunc(session)
...

# lib.py
client = pymongo.MongoClient(HOST_FILE, tz_aware=True)
dbname = client['databases']
AddrCollection = dbname['address']
...
def SomeFunc(AddrCollection, session)
AddrCollection.insert_one(data, session=session)

--

--

sig03
sig03

No responses yet